>> [عزف الموسيقى]
>> ZAMYLA تشان: ضربة دعونا الامور مع تغيير الحجم.
في تغيير الحجم، وسيكون المستخدم تمرير في، عبر سطر الأوامر، صورة النقطية التي
انهم يريدون لك لتوسيع نطاق من قبل عدد أنهم أيضا تمرير في،
في سطر الأوامر.
كيف نفعل ذلك؟
>> حسنا، أول الأشياء أولا، دعونا كسر هذه أسفل إلى خطوات.
كنت تريد الذهاب الى فتح INFILE أنها تعطيك، وكذلك
إنشاء وفتح OUTFILE أن وأنت تسير لوضع
تغيير حجم الصورة فيه.
ثم، لأنك تغيير الحجم، و لأنها صورة نقطية، فإنه رأس، لذلك
وأنت تسير أيضا إلى تحديث رأس معلومات عن OUTFILE،
والكتابة التي فيها
ثم، وأنت تسير لقراءة في وscanline للمن INFILE،
بكسل حسب بكسل، أو تغيير حجمها أفقيا وكتابة تلك بكسل في
OUTFILE، على النحو المحدد بواسطة مقياس للمستخدم.
>> وأنت تسير أن نتذكر أن إضافة الحشو عند الضرورة.
المزيد عن ذلك لاحقا.
وبعد ذلك، أيضا تغيير حجم عموديا.
موافق.
ولذلك فإن هذا سيكون أكثر قليلا تعقيدا من الذي فعلت ذلك، ولكن
ما هو مماثل سوف أن copy.c، مرة أخرى، أن تكون مفيدة جدا.
تذكر أن copy.c يفتح الملف، بتحديث معلومات رأس ل
OUTFILE، ثم يقرأ في scanline لل، بكسل حسب بكسل، وكتابة كل بكسل
في scanline للملف الإخراج ل.
>> ذلك مرة أخرى، ربما الخطوة الأولى ربما يكون لحزب المحافظين، copy.c، resize.c
في الدليل PSET5 الخاص بك.
تذكر رغم ذلك، قبل نسخ منه، للتأكد من أن تفهم
copy.c جيدا جدا.
موافق.
>> لذلك دعونا فتح ملف.
كنت تعرف كيف تفعل ذلك.
أنا ذاهب إلى ترك ذلك لك.
المقبل، وتحديث معلومات رأس لOUTFILE.
لأن لدينا صورة نقطية جديدة، لدينا معلومات رأس جديد.
ما يتغير هنا؟
حسنا، حجم الملف هو الذهاب الى تغيير لأننا ذاهبون الى الحصول على مزيد من
بكسل من ذي قبل.
حجم الصورة، وبالتالي، كما سيتغير، كما هو
العرض والارتفاع.
>> لذلك المتغيرات التي تعتبر تلك، بالضبط؟
حسنا، إذا نظرت في رأس المعلومات، كما ترى هناك
biSizeImage، والذي يمثل مجموع حجم الصورة في بايت،
بما في ذلك بكسل والحشو.
biWidth هو عرض الصورة في بكسل، ناقص الحشو.
biHeight هو ارتفاع الصورة بالبكسل.
وهكذا ترد تلك الموجودة في البنيات BITMAPFILEHEADER و
BITMAPINFOHEADER.
يمكن أن أقول لكم من هو الذي كتبها الذهاب الى bmp.h وتبحث في
البنية BITMAPINFOHEADER ورؤية وهي مدرجة المتغيرات هناك.
>> لذلك لتحديث رأس outfiles المعلومات، وأنت تريد الذهاب الى ل
تغيير تلك القيم من الطول والعرض.
ولكن هناك احتمالات، قد تحتاج بعض المعلومات رأس INFILE ل
في وقت لاحق، لذلك الأفضل أن تتبع كلا.
ولكن أن تكون واضحة جدا مع المتغير الخاص أسماء حتى يتسنى لك لا بطريق الخطأ
كتابة القيم غير صحيحة في رأس لOUTFILE.
>> حتى الآن دعونا نصل الى قراءة في وscanline للبكسل تلو بكسل.
مرة أخرى، ونحن في طريقنا لتحويل لدينا مضمونة ملف I مكتبة / O، وإلقاء نظرة على
وظيفة fread.
fread يأخذ في مؤشر إلى البنية التي سوف تحتوي على وحدات البايت التي
كنت تقرأ في، حجم كل العنصر الذي كنت تقرأ -
مرة أخرى، sizeof ستكون مفيدة تعمل هنا، وعدد من
عناصر حجمها، وحجمها، والتي كنت قراءة في، ثم في النهاية، و
inpointer، الملف الذي كنت تقرأ من.
لذلك كنت أخذ عناصر العدد من حجمها من inpointer، و
وضعها موضع البيانات.
>> الآن حان الوقت لتغيير حجم أفقيا.
إذا كان n يساوي 2، ثم لكل بكسل في وINFILE، ونحن في طريقنا لأنه يكتب
مرتين في OUTFILE.
كيف نكتب الملفات؟
كذلك، لدينا وظيفة fwrite، لذلك لقد اتخذنا المؤشر إلى البنية
الذي يحتوي على وحدات البايت التي كنت الكتابة من ثم نمر في
الحجم والعدد، والإخراج، حيث كنت على وشك أن أكتب ذلك.
ثم لتكرار العملية، سيكون قادرة على تكرارية بسيطة للحلقة.
>> ولكن علينا أن نتذكر لإضافة الحشو فيها.
مفهوم الحشو هو أنه، أيضا، كل بكسل هو ثلاث لدغات، ولكن
حجم كل بد scanline لل تكون متعددة من 4 بايت.
لذلك إذا كان عدد البكسل ليس متعددة من 4، ونحن بحاجة إلى إضافة بعض
الحشو، والذي هو مجرد أصفار.
الآن، على عكس الذي فعلت ذلك، وخلافا ل نسخة، ثم صورة INFILE و
ملف OUTFILE لقد المختلفة لها الحشو مختلفة لأنهم
العروض المختلفة.
>> موافق.
لذلك ربما سيكون صيغة تأتي في متناول اليدين هنا.
سأترك ذلك لكم للعثور عليه، ولكن اقول لكم ان لإرسال الحشو،
حسنا، انها مجرد وظيفة fputc بسيطة، يمر في شخصية
أن كنت تريد أن تكتب، ثم مؤشر الملف الذي
أريد أن أكتب ل.
وحتى الآن بعد أن قمنا حجمها أفقيا، وتستخدم ثم الحشو،
تذكر أنك تحتاج إلى نقل الملف الخاص بك مؤشر الموقف، لأنك
لا يمكن fread في الحشو.
لذلك كنت ترغب في التأكد من أن الملف الخاص بك مؤشر الموقف في INFILE
عند نقطة الصحيح.
لأننا نريد أن أيضا تغيير حجم عموديا.
نحن لا يمكن أن تمتد أفقيا، لأن كل احتياجات الصف
ليتم نسخها مرات ن.
>> الآن، هناك عدة مختلفة طرق للقيام بذلك.
حتى واحد، يمكننا استخدام طريقة إعادة كتابة، في أن نتذكر كل بكسل
من صف محدد في صفيف، و ثم نكتب هذا الصفيف كما
عدة مرات حسب الحاجة.
أو هناك طريقة إعادة نسخ حيث، بعد القراءة في صف واحد في INFILE
ثم أن الكتابة في OUTFILE، إضافة الحشو، ونحن fseek
عودة إلى بداية الصف الأصلي، وكرر ثم الأفقي
تغيير حجم من هناك.
بغض النظر عن الأسلوب، رغم ذلك، عليك تريد كل بكسل أن يتكرر
n مرة، وفي كل صف ليكون وكرر مرات ن كذلك.
>> مع ذلك، سيكون لديك نقطية أكبر من الحياة.
اسمي Zamyla، وهذا هو CS50.