Giả sử hình ảnh là w * h pixel và được lưu trữ ở đúng định dạng RGB "đóng gói" không có thành phần alpha, mỗi pixel sẽ yêu cầu ba byte.
Trong ký ức, dòng đầu tiên của hình ảnh có thể được trình bày trong đồ họa ASCII tuyệt vời như thế này:
R0 G0 B0 R1 G1 B1 R2 G2 B2 ... R(w-1) G(w-1) B(w-1)
Ở đây, mỗi R n G n và B n đại diện cho một byte đơn , cho thành phần màu đỏ, xanh lục hoặc xanh lam của pixel n của đường quét đó. Lưu ý rằng thứ tự của các byte có thể khác nhau đối với các định dạng "thô" khác nhau; không có tiêu chuẩn thế giới được thỏa thuận. Môi trường khác nhau (card đồ họa, máy ảnh, ...) làm điều đó khác nhau vì bất kỳ lý do gì, bạn chỉ cần biết bố cục.
Reading ra một điểm ảnh sau đó có thể được thực hiện bằng chức năng này:
typedef unsigned char byte;
void get_pixel(const byte *image, unsigned int w,
unsigned int x,
unsigned int y,
byte *red, byte *green, byte *blue)
{
/* Compute pointer to first (red) byte of the desired pixel. */
const byte * pixel = image + w * y * 3 + 3 * x;
/* Copy R, G and B to outputs. */
*red = pixel[0];
*green = pixel[1];
*blue = pixel[2];
}
Chú ý cách chiều cao của hình ảnh là không cần thiết để làm việc này, và làm thế nào các chức năng thoát khỏi giới hạn kiểm tra. Một chức năng chất lượng sản xuất có thể được mạ giáp hơn.
Cập nhật Nếu bạn đang lo lắng phương pháp này sẽ là quá chậm, bạn có thể tất nhiên chỉ vòng qua các điểm ảnh, thay vì:
unsigned int x, y;
const byte *pixel = /* ... assumed to be pointing at the data as per above */
for(y = 0; y < h; ++y)
{
for(x = 0; x < w; ++x, pixel += 3)
{
const byte red = pixel[0], green = pixel[1], blue = pixel[2];
/* Do something with the current pixel. */
}
}
Bạn cần chỉ định cách hiển thị "hình ảnh thô" và định dạng đó là gì. – sharptooth
Xác định "hình ảnh thô". Đây có phải là tệp hình ảnh không? Nếu vậy, loại tập tin nào? Hay bạn đang cố chụp ảnh màn hình?Chỉnh sửa câu hỏi của bạn để thêm chi tiết. – Artelius
Định dạng "thô" của bạn là định dạng nào. Nó có phải là một bitmap hoặc một tập tin hình ảnh lấy từ một máy ảnh có lẽ? – ChrisBD