8086 এমএস-ডস .কম ফাইল / বিএমপি, আউটপুট ফাইলের আকার = 2192 বাইট
এনকোডার
এনকোডারটি সি তে লেখা হয় এটি দুটি আর্গুমেন্ট নেয়: ইনপুট ফাইল এবং আউটপুট ফাইল। ইনপুট ফাইলটি একটি 64x64 RAW আরজিবি চিত্র (যার অর্থ এটি কেবল 4096 আরজিবি ট্রিপল্ট)। রঙের সংখ্যা 4 টির মধ্যে সীমাবদ্ধ যাতে প্যালেটটি যতটা সম্ভব সংক্ষিপ্ত হতে পারে। এটি তার কাজগুলিতে খুব সোজা-এগিয়ে; এটি কেবল একটি প্যালেট তৈরি করে, পিক্সেল জোড়াকে বাইটে প্যাক করে এবং প্রাক-তৈরি শিরোনাম এবং ডিকোডার প্রোগ্রামের সাথে একসাথে আঠালো করে তোলে।
#include <stdio.h>
#include <stdlib.h>
#define MAXPAL 4
#define IMAGESIZE 64 * 64
int main(int argc, char **argv)
{
FILE *fin, *fout;
unsigned char *imgdata = malloc(IMAGESIZE * 3), *outdata = calloc(IMAGESIZE / 2, 1);
unsigned palette[MAXPAL] = {0};
int pal_size = 0;
if (!(fin = fopen(argv[1], "rb")))
{
fprintf(stderr, "Could not open \"%s\".\n", argv[1]);
exit(1);
}
if (!(fout = fopen(argv[2], "wb")))
{
fprintf(stderr, "Could not open \"%s\".\n", argv[2]);
exit(2);
}
fread(imgdata, 1, IMAGESIZE * 3, fin);
for (int i = 0; i < IMAGESIZE; i++)
{
// BMP saves the palette in BGR order
unsigned col = (imgdata[i * 3] << 16) | (imgdata[i * 3 + 1] << 8) | (imgdata[i * 3 + 2]), palindex;
int is_in_pal = 0;
for (int j = 0; j < pal_size; j++)
{
if (palette[j] == col)
{
palindex = j;
is_in_pal = 1;
}
}
if (!is_in_pal)
{
if (pal_size == MAXPAL)
{
fprintf(stderr, "Too many unique colours in input image.\n");
exit(3);
}
palindex = pal_size;
palette[pal_size++] = col;
}
// High nibble is left-most pixel of the pair
outdata[i / 2] |= (palindex << !(i & 1) * 4);
}
char BITMAPFILEHEADER[14] = {
0x42, 0x4D, // "BM" magic marker
0x90, 0x08, 0x00, 0x00, // FileSize
0x00, 0x00, // Reserved1
0x00, 0x00, // Reserved2
0x90, 0x00, 0x00, 0x00 // ImageOffset
};
char BITMAPINFOHEADER[40] = {
0x28, 0x00, 0x00, 0x00, // StructSize
0x40, 0x00, 0x00, 0x00, // ImageWidth
0x40, 0x00, 0x00, 0x00, // ImageHeight
0x01, 0x00, // Planes
0x04, 0x00, // BitsPerPixel
0x00, 0x00, 0x00, 0x00, // CompressionType (0 = none)
0x00, 0x00, 0x00, 0x00, // RawImagDataSize (0 is fine for non-compressed,)
0x00, 0x00, 0x00, 0x90, // HorizontalRes
// db 0, 0, 0
// nop
0xEB, 0x1A, 0x90, 0x90, // VerticalRes
// jmp Decoder
// nop
// nop
0x04, 0x00, 0x00, 0x00, // NumPaletteColours
0x00, 0x00, 0x00, 0x00, // NumImportantColours (0 = all)
};
char DECODER[74] = {
0xB8, 0x13, 0x00, 0xCD, 0x10, 0xBA, 0x00, 0xA0, 0x8E, 0xC2, 0xBA,
0xC8, 0x03, 0x31, 0xC0, 0xEE, 0x42, 0xBE, 0x38, 0x01, 0xB1, 0x04,
0xFD, 0x51, 0xB1, 0x03, 0xAC, 0xD0, 0xE8, 0xD0, 0xE8, 0xEE, 0xE2,
0xF8, 0x83, 0xC6, 0x07, 0x59, 0xE2, 0xEF, 0xFC, 0xB9, 0x00, 0x08,
0xBE, 0x90, 0x01, 0xBF, 0xC0, 0x4E, 0xAC, 0xD4, 0x10, 0x86, 0xC4,
0xAB, 0xF7, 0xC7, 0x3F, 0x00, 0x75, 0x04, 0x81, 0xEF, 0x80, 0x01,
0xE2, 0xEE, 0x31, 0xC0, 0xCD, 0x16, 0xCD, 0x20,
};
fwrite(BITMAPFILEHEADER, 1, 14, fout);
fwrite(BITMAPINFOHEADER, 1, 40, fout);
fwrite(palette, 4, 4, fout);
fwrite(DECODER, 1, 74, fout);
// BMPs are stored upside-down, because why not
for (int i = 64; i--; )
fwrite(outdata + i * 32, 1, 32, fout);
fclose(fin);
fclose(fout);
return 0;
}
আউটপুট ফাইল
আউটপুট ফাইলটি একটি বিএমপি ফাইল যা .COM নামকরণ এবং একটি ডস পরিবেশে চালানো যেতে পারে। মৃত্যুদন্ড কার্যকর হওয়ার পরে, এটি ভিডিও মোড 13 এ পরিবর্তিত হবে এবং চিত্রটি প্রদর্শন করবে।
একটি বিএমপি ফাইলে একটি বিটম্যাপফিলহাইডার একটি প্রথম শিরোলেখ রয়েছে, যা ফিল্ড ইমেজঅফসেট অন্যান্য বিষয়গুলির মধ্যে রয়েছে, যা ফাইলের মধ্যে যেখানে চিত্রের ডেটা শুরু হয় তা বোঝায়। এর পরে বিটম্যাপিনফোহাইডার আসবে বিভিন্ন ডি-/ এনকোডিং তথ্য, তারপরে একটি প্যালেট ব্যবহার করা হয়। ইমেজঅফসেটের একটি মান থাকতে পারে যা যে কোনও শিরোনামের শেষের বাইরে পয়েন্ট করে, আমাদেরকে ডিকোডারকে থাকার জন্য একটি ফাঁক তৈরি করতে দেয় ough মোটামুটি:
BITMAPFILEHEADER
BITMAPINFOHEADER
PALETTE
<gap>
IMAGE DATA
আর একটি সমস্যা হ'ল ডিকোডারটি প্রবেশ করানো। BITMAPFILEHEADER এবং BITMAPINFOHEADER এগুলি আইনী মেশিন কোড (যা একটি পুনরুদ্ধারযোগ্য রাষ্ট্র উত্পাদন করে না) তা নিশ্চিত করার জন্য টিঙ্কার্ক করা যেতে পারে, তবে প্যালেটটি আরও জটিল। আমরা অবশ্যই প্যালেটটি কৃত্রিমভাবে দীর্ঘতর করতে পারি এবং সেখানে মেশিন কোডটি রেখে দিতে পারি, তবে আমি পরিবর্তে কোডটি সঠিকভাবে প্রান্তিককরণ করতে পূর্বের বাইকপেলস্পারমিটার এবং বিওয়াইপেলস্পেরমিটার ক্ষেত্রগুলি এবং ডিকোডারটিতে ঝাঁপ দেওয়ার জন্য ক্ষেত্রগুলি ব্যবহার করতে পছন্দ করেছি। এই ক্ষেত্রগুলি অবশ্যই অবশ্যই সেগুলিতে আবর্জনা ফেলবে, তবে আমি যে কোনও চিত্র দর্শকের চিত্র পরীক্ষা করে দেখিয়েছি তা ঠিক আছে fine যদিও এটি মুদ্রণ অদ্ভুত ফলাফল হতে পারে, যদিও।
এটি যতদূর আমি জানি, মান-সম্মতিযুক্ত।
JMP
বিটম্যাপফিলিএইডারের সংরক্ষিত ক্ষেত্রগুলির একটিতে যদি নির্দেশনা দেওয়া হয় তবে একটি সংক্ষিপ্ত ফাইল তৈরি করতে পারে । এটি আমাদের height৪ এর পরিবর্তে চিত্রের উচ্চতা--৪ হিসাবে সংরক্ষণ করতে দেয়, যা বিএমপি ফাইলগুলির যাদুকর আশ্চর্যের মধ্যে রয়েছে যে চিত্রটির ডেটা সঠিক উপায়ে সংরক্ষণ করা হয়েছে, যার ফলস্বরূপ সরলিকৃত ডিকোডারের অনুমতি দেওয়া হবে।
সঙ্কেতমোচক
ডিকোডারটিতে কোনও বিশেষ কৌশল নেই। প্যালেটটি এনকোডার দ্বারা পপুলেট করা হয়, এবং এখানে ডামি-মান সহ প্রদর্শিত হয়। এটি কীপ্রেসের উপরে ডস-এ ফিরে না এলে এটি কিছুটা ছোট হতে পারে তবে এটি ছাড়া টেস্ট করা মজাদার ছিল না। আপনি যদি মনে করেন আপনার অবশ্যই, আপনি jmp $
কয়েকটি বাইট সংরক্ষণ করার জন্য শেষ তিনটি নির্দেশাবলী প্রতিস্থাপন করতে পারেন । (আপনি যদি ফাইল শিরোনাম আপডেট করতে ভুলবেন না!)
বিএমপি প্যালেটগুলিকে বিজিআর ( আরজিবি নয় ) ট্রিপল্ট হিসাবে জিরো দিয়ে প্যাড করে স্টোর করে । এটি ভিজিএ প্যালেট সেটআপ করা স্বাভাবিকের চেয়ে আরও বিরক্তিকর করে তোলে। বিএমপিগুলি কেবল উল্টোভাবে সঞ্চিত থাকে তা কেবল স্বাদে (এবং আকার) যুক্ত করে।
এনএএসএম শৈলীতে এখানে তালিকাভুক্ত:
Palette:
db 0, 0, 0, 0
db 0, 0, 0, 0
db 0, 0, 0, 0
db 0, 0, 0, 0
Decoder:
; Set screen mode
mov ax, 0x13
int 0x10
mov dx, 0xa000
mov es, dx
; Prepare to set palette
mov dx, 0x3c8
xor ax, ax
out dx, al
inc dx
mov si, Palette + 2
mov cl, 4
std
pal_loop:
push cx
mov cl, 3
pal_inner:
lodsb
shr al, 1
shr al, 1
out dx, al
loop pal_inner
add si, 7
pop cx
loop pal_loop
cld
; Copy image data to video memory
mov cx, 64 * 64 / 2
mov si, ImageData
mov di, 20160
img_loop:
lodsb
aam 16
xchg al, ah
stosw
test di, 63
jnz skip
sub di, 384
skip:
loop img_loop
; Eat a keypress
xor ax, ax
int 0x16
; Return to DOS
int 0x20
ImageData:
.exe
চ্যালেঞ্জের অংশের জন্য কিছু প্রকারের কোড যুক্ত করেছি এবং এটি যখন দেখি তখন.png
এই.exe
কোডের উপর ভিত্তি করে পরিবর্তিত পিক্সেল রয়েছে । এটি এখনও.png
দেখার মতো যতক্ষণ পর্যন্ত এটি অনুমোদিত ? আউটপুট চিত্রটিতেও কি কমপক্ষে 4 টি রঙ থাকতে হবে?