PGM হলো Portable Gray Map। যদি আমরা সি-তে একটি ২D অ্যারে PNG, JPEG, বা অন্য কোনো ইমেজ ফরম্যাটে ইমেজ হিসেবে সংরক্ষণ করতে চাই, তবে ডেটাকে নির্দিষ্ট ফরম্যাটে এনকোড করার জন্য অনেক কাজ করতে হয় ফাইলে লেখার আগে।
Netpbm ফরম্যাট একটি সহজ এবং পোর্টেবল সমাধান দেয়। Netpbm হলো গ্রাফিক্স প্রোগ্রামের একটি ওপেন সোর্স প্যাকেজ যা মূলত লিনাক্স বা ইউনিক্স প্ল্যাটফর্মে ব্যবহার হয়। এটি মাইক্রোসফট উইন্ডোজ সিস্টেমেরও অধীনে কাজ করে।
প্রতিটি ফাইল দুই বাইটের একটি ম্যাজিক নাম্বার (magic number) দিয়ে শুরু হয়। এই ম্যাজিক নাম্বারটি ফাইল টাইপ শনাক্ত করতে ব্যবহৃত হয়। টাইপগুলো হলো PBM, PGM, PPM ইত্যাদি। এটি এনকোডিংও শনাক্ত করে (ASCII বা Binary)। ম্যাজিক নাম্বার হলো একটি ক্যাপিটাল P এবং এরপর একটি একক অঙ্ক।
ASCII এনকোডিং হিউম্যান রিডেবিলিটি এবং অন্য প্ল্যাটফর্মে সহজ ট্রান্সফার দেয়; বাইনারি ফরম্যাট ফাইল সাইজে বেশি দক্ষ হলেও এটি নেটিভ বাইট-অর্ডার ইস্যু থাকতে পারে।
PGM ফাইল কীভাবে লিখব?
- ম্যাজিক নাম্বার P2 সেট করুন
- হোয়াইটস্পেস যোগ করুন (স্পেস, ট্যাব, CR, LF)
- প্রস্থ (width) যোগ করুন, ASCII ডেসিমেল ক্যারেক্টার হিসেবে ফরম্যাট করা
- হোয়াইটস্পেস যোগ করুন
- উচ্চতা (height) যোগ করুন, ASCII ডেসিমেল ক্যারেক্টার হিসেবে ফরম্যাট করা
- হোয়াইটস্পেস যোগ করুন
- সর্বোচ্চ গ্রে ভ্যালু দিন, আবার ASCII ডেসিমেলে
- হোয়াইটস্পেস যোগ করুন
- Width x Height গ্রে ভ্যালু, প্রতিটি ASCII ডেসিমেলে (রেঞ্জ ০ থেকে সর্বোচ্চ ভ্যালু), টপ টু বটম হোয়াইটস্পেস দ্বারা আলাদা করে।
উদাহরণ কোড
#include <stdio.h>
main() {
int i, j;
int w = 13, h = 13;
// এই ২D অ্যারে ইমেজ-এ রূপান্তরিত হবে। আকার ১৩ x ১৩
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"); // বাইনারি মোডে ফাইল লিখা
fprintf(pgmimg, "P2\n"); // ম্যাজিক নাম্বার ফাইলে লিখা
fprintf(pgmimg, "%d %d\n", w, h); // প্রস্থ ও উচ্চতা ফাইলে লিখা
fprintf(pgmimg, "255\n"); // সর্বোচ্চ গ্রে ভ্যালু লিখা
int count = 0;
for (i = 0; i < h; i++) {
for (j = 0; j < w; j++) {
fprintf(pgmimg, "%d ", image[i][j]); // অ্যারে থেকে গ্রে ভ্যালু ফাইলে কপি
}
fprintf(pgmimg, "\n");
}
fclose(pgmimg);
}
PGM ইমেজটি নিচের ছবির মতো দেখাবে
আউটপুট
