>> [MUSIC CHƠI]
>> ZAMYLA CHAN: Hãy thổi mọi thứ với thay đổi kích cỡ.
Trong thay đổi kích cỡ, người dùng sẽ vượt qua trong, thông qua dòng lệnh, một hình ảnh bitmap
họ muốn bạn để mở rộng bởi một số rằng họ cũng vượt qua trong,
trong dòng lệnh.
Làm thế nào để chúng tôi làm điều này?
>> Vâng, điều đầu tiên đầu tiên, chúng ta hãy phá vỡ này thành các bước.
Bạn sẽ muốn mở infile họ cung cấp cho bạn, cũng như
tạo và mở outfile mà bạn sẽ đặt
hình ảnh thay đổi kích cỡ in
Sau đó, bởi vì bạn đang thay đổi kích thước, và bởi vì đó là một bitmap, cho nó một tiêu đề, vì vậy
bạn sẽ còn cập nhật các tiêu đề thông tin cho outfile,
và viết rằng in
Sau đó, bạn sẽ đọc vào các scanline của infile,
pixel-by-pixel, thay đổi kích thước theo chiều ngang và viết những điểm ảnh vào
outfile, theo quy định bởi quy mô của người dùng.
>> Bạn sẽ nhớ thêm đệm khi cần thiết.
Thêm về điều này sau.
Và sau đó, cũng thay đổi kích thước theo chiều dọc.
OK.
Vì vậy, đây là có được nhiều hơn một chút phức tạp hơn ai thực hiện nó, nhưng
những gì tương tự như là copy.c sẽ, một lần nữa, chứng minh rất hữu ích.
Hãy nhớ rằng copy.c mở một tập tin, cập nhật các thông tin tiêu đề cho
outfile, sau đó đọc vào scanline, pixel-by-pixel, viết mỗi điểm ảnh
vào scanline các tập tin đầu ra.
>> Vì vậy, một lần nữa, bước đầu tiên của bạn có thể có thể được cp, copy.c, resize.c
vào thư mục PSET5 của bạn.
Nhớ mặc dù, trước khi bạn sao chép nó, để đảm bảo rằng bạn hiểu
copy.c rất kỹ lưỡng.
OK.
>> Vì vậy, hãy mở một tập tin.
Bạn biết làm thế nào để làm điều đó.
Tôi sẽ để lại đó cho bạn.
Tiếp theo, cập nhật các thông tin tiêu đề cho outfile.
Bởi vì chúng ta có một bitmap mới, chúng tôi có thông tin mới tiêu đề.
Có gì thay đổi ở đây?
Tốt, kích thước tập tin là sẽ thay đổi bởi vì chúng ta sẽ có nhiều
pixel so với trước đây.
Kích thước hình ảnh là, do đó, cũng sẽ thay đổi, như là
chiều rộng và chiều cao.
>> Vì vậy, đó là những biến, chính xác?
Vâng, nếu bạn nhìn vào tiêu đề thông tin, bạn sẽ thấy có
biSizeImage, đại diện cho tổng số kích thước của hình ảnh trong byte,
bao gồm các điểm ảnh và padding.
biWidth là chiều rộng của hình ảnh trong điểm ảnh, âm đệm.
biHeight là chiều cao của hình ảnh theo pixel.
Và do đó, những được chứa trong cấu trúc và BITMAPFILEHEADER
BITMAPINFOHEADER.
Bạn có thể nói đó là một trong mà theo sẽ bmp.h và nhìn vào
BITMAPINFOHEADER cấu trúc và nhìn thấy mà biến được liệt kê ở đó.
>> Vì vậy, để cập nhật tiêu đề outfiles thông tin, bạn sẽ muốn
thay đổi các giá trị của chiều cao và chiều rộng.
Nhưng rất có thể là, bạn có thể cần một số của thông tin tiêu đề của infile
sau đó, vì vậy tốt nhất để theo dõi cả hai.
Nhưng rất rõ ràng với biến của bạn tên để bạn không vô tình
viết các giá trị không chính xác trong tiêu đề cho outfile.
>> Vì vậy, bây giờ chúng ta hãy để đọc vào các scanline pixel-by-pixel.
Một lần nữa, chúng ta sẽ chuyển sang đáng tin cậy của chúng tôi nộp I / O thư viện, và nhìn vào
chức năng fread.
fread mất trong một con trỏ đến một cấu trúc sẽ chứa các byte
bạn đang đọc trong, kích thước của mỗi yếu tố mà bạn đang đọc -
một lần nữa, sizeof sẽ là hữu ích hoạt động ở đây, số lượng các
các yếu tố kích thước, kích thước, mà bạn đọc trong, và sau đó cuối cùng,
inpointer, các tập tin mà bạn đang đọc từ.
Vì vậy, bạn đang dùng các yếu tố số kích thước từ inpointer, và
đưa vào dữ liệu.
>> Bây giờ là lúc để thay đổi kích thước theo chiều ngang.
nếu n bằng 2, sau đó cho mỗi điểm ảnh trong các infile, chúng ta sẽ viết nó
hai lần trong outfile.
Làm thế nào để chúng ta viết các tập tin?
Vâng, chúng tôi có chức năng fwrite, vì vậy chúng tôi đã đưa con trỏ đến cấu trúc
có chứa các byte mà bạn viết từ, và sau đó chúng tôi vượt qua trong
kích thước, số lượng, và đầu ra, nơi bạn sẽ được viết đó.
Và sau đó lặp lại một quá trình, sẽ có thể lặp đi lặp lại một đơn giản cho vòng lặp.
>> Nhưng chúng ta cần nhớ thêm đệm in
Các khái niệm về đệm là, tốt, mỗi điểm ảnh là ba cắn, nhưng
kích thước của mỗi scanline phải là bội số của 4 byte.
Vì vậy, nếu số lượng điểm ảnh không phải là một bội số của 4, chúng ta cần thêm một số
đệm, mà chỉ là zero.
Bây giờ, không giống như Ai thực hiện nó, và không giống như bản sao, sau đó hình ảnh infile và
tập tin outfile đã khác nhau có đệm khác nhau bởi vì chúng
độ rộng khác nhau.
>> OK.
Vì vậy, có lẽ là một công thức sẽ có ích ở đây.
Tôi sẽ để lại nó cho bạn để tìm thấy nó ra, nhưng nói với bạn rằng, để viết đệm,
tốt, nó chỉ là một chức năng fputc đơn giản, đi qua trong nhân vật
mà bạn muốn viết, và sau đó con trỏ tập tin mà bạn
muốn ghi vào.
Vì vậy, bây giờ mà chúng tôi đã thay đổi kích thước theo chiều ngang, và sau đó sử dụng đệm,
hãy nhớ rằng bạn cần phải di chuyển tập tin của bạn chỉ báo vị trí, bởi vì bạn
không thể fread vào đệm.
Vì vậy, bạn muốn chắc chắn rằng tập tin của bạn chỉ số vị trí trong infile
là tại thời điểm chính xác.
Bởi vì chúng tôi cũng muốn thay đổi kích thước theo chiều dọc.
Chúng ta không thể kéo dài nó theo chiều ngang, bởi vì mỗi nhu cầu hàng
được sao chép n lần.
>> Bây giờ, có một số khác nhau cách để làm điều này.
Vì vậy, một, chúng tôi có thể sử dụng một phương pháp viết lại, trong rằng chúng ta nhớ tất cả các điểm ảnh
của một hàng được đưa ra trong một mảng, và sau đó chúng tôi viết mảng như
nhiều lần khi cần thiết.
Hoặc có phương pháp recopy nơi, sau khi đọc trong một hàng trong infile
và sau đó viết rằng vào outfile, thêm đệm, chúng tôi fseek
sao cho sự bắt đầu của hàng ban đầu, và sau đó lặp lại ngang
thay đổi kích thước từ đó.
Không phân biệt của phương pháp này, tuy nhiên, bạn sẽ muốn mỗi điểm ảnh được lặp đi lặp lại
n lần, và mỗi hàng là lặp đi lặp lại n lần là tốt.
>> Cùng với đó, bạn sẽ có bitmap lớn hơn cuộc sống.
Tên tôi là Zamyla, và đây là CS50.