PGM là Bản đồ màu xám di động. Nếu chúng ta muốn lưu trữ mảng 2d trong C dưới dạng ảnh ở định dạng PNG, JPEG hoặc bất kỳ định dạng ảnh nào khác, chúng ta phải làm rất nhiều việc để mã hóa dữ liệu ở một số định dạng cụ thể trước khi ghi vào tệp.
Định dạng Netpbm cung cấp một giải pháp dễ dàng và di động. Netpbm là một gói chương trình đồ họa mã nguồn mở và nó được sử dụng cơ bản trong nền tảng linux hoặc Unix. Nó cũng hoạt động trong hệ thống Microsoft Windows.
Mỗi tệp bắt đầu bằng một số ma thuật hai byte. Số ma thuật này được sử dụng để xác định loại tệp. Các loại là PBM, PGM, PPM, v.v. Nó cũng xác định mã hóa (ASCII hoặc Binary). Con số kỳ diệu là chữ P viết hoa theo sau là một số có một chữ số.
Mã hóa ASCII cho phép con người có thể đọc được và dễ dàng chuyển sang các nền tảng khác; định dạng nhị phân hiệu quả hơn về kích thước tệp nhưng nó có thể có vấn đề về thứ tự byte gốc.
Cách ghi tệp PGM?
- Đặt con số kỳ diệu P2
- Thêm khoảng trắng (Dấu cách, Tab, CR, LF)
- Thêm chiều rộng, được định dạng dưới dạng ký tự ASCII ở dạng thập phân
- Thêm khoảng trắng
- Thêm chiều cao, được định dạng dưới dạng ký tự ASCII ở dạng thập phân
- Thêm khoảng trắng
- Đặt giá trị màu xám lớn nhất, một lần nữa ở dạng thập phân ASCII
- Thêm khoảng trắng
- Các giá trị màu xám Rộng x Cao, mỗi giá trị ở dạng thập phân ASCII (Phạm vi từ 0 đến giá trị lớn nhất), được phân tách bằng khoảng trắng từ trên xuống dưới.
Mã mẫu
#include <stdio.h> main() { int i, j; int w = 13, h = 13; // This 2D array will be converted into an image The size is 13 x 13 int image[13][13] = { { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 }, { 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31}, { 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47}, { 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}, { 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79}, { 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95 }, { 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111}, { 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127}, { 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143}, { 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159}, { 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175}, { 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191}, { 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207} }; FILE* pgmimg; pgmimg = fopen("my_pgmimg.pgm", "wb"); //write the file in binary mode fprintf(pgmimg, "P2\n"); // Writing Magic Number to the File fprintf(pgmimg, "%d %d\n", w, h); // Writing Width and Height into the file fprintf(pgmimg, "255\n"); // Writing the maximum gray value int count = 0; for (i = 0; i < h; i++) { for (j = 0; j < w; j++) { fprintf(pgmimg, "%d ", image[i][j]); //Copy gray value from array to file } fprintf(pgmimg, "\n"); } fclose(pgmimg); }
Hình ảnh PGM giống như bên dưới
Đầu ra