স্ব-প্রদর্শন চিত্র [বন্ধ]


11

পটভূমি

স্ব-এক্সট্র্যাক্টিং .ZIPফাইল রয়েছে। সাধারণত তাদের এক্সটেনশন থাকে .EXE(এবং ফাইলটি কার্যকর করে তারা বের করা হবে) তবে তাদের নাম পরিবর্তন করার সময় .ZIPআপনি কিছু জিপ এক্সট্রাক্টিং সফ্টওয়্যার দিয়ে ফাইলটি খুলতে পারেন।

(এটি সম্ভব কারণ .EXEফাইলগুলির জন্য একটি নির্দিষ্ট শিরোলেখের .ZIPপ্রয়োজন হয় তবে ফাইলগুলিকে একটি নির্দিষ্ট ট্রেলার দরকার হয় তাই একটি ফাইল তৈরি করা সম্ভব যা একটি .EXEশিরোনাম এবং .ZIPট্রেইলার উভয়ই থাকে ))

তোমার কাজ:

এমন একটি প্রোগ্রাম তৈরি করুন যা "স্ব-প্রদর্শন" চিত্র ফাইল তৈরি করে:

  • প্রোগ্রামটি ইনপুট হিসাবে কিছু 64x64 চিত্র (কমপক্ষে 4 টি রঙ সমর্থিত হবে) এবং আউটপুট হিসাবে কিছু "সম্মিলিত" ফাইল নেবে
  • প্রোগ্রামটির আউটপুট ফাইলটি সাধারণ চিত্র দর্শকদের দ্বারা চিত্র ফাইল হিসাবে স্বীকৃত হবে
  • চিত্র দর্শকের সাথে আউটপুট ফাইলটি খোলার সময়, ইনপুট চিত্রটি প্রদর্শিত হবে
  • আউটপুট ফাইলটি কোনও অপারেটিং সিস্টেম বা কম্পিউটারের জন্য এক্সিকিউটেবল ফাইল হিসাবে স্বীকৃত হবে

    (যদি কোনও অস্বাভাবিক অপারেটিং সিস্টেম বা কম্পিউটারের জন্য একটি ফাইল তৈরি করা হয় তবে একটি মুক্ত-উত্সের পিসি এমুলেটর উপস্থিত থাকলে এটি চমৎকার হবে However তবে এটির প্রয়োজন নেই))

  • আউটপুট ফাইল কার্যকর করার সময়, ইনপুট চিত্রটি প্রদর্শিত হবে
  • এটা সম্ভাব্য যে (থেকে উদাহরণস্বরূপ ফাইল পুনঃনামকরনের .PNGকরার .COM) প্রয়োজনীয়
  • এটি প্রয়োজন হয় না যে প্রোগ্রাম এবং এটির আউটপুট ফাইল একই OS এ চালিত হয়; প্রোগ্রামটি উদাহরণস্বরূপ একটি উইন্ডোজ প্রোগ্রাম এবং আউটপুট ফাইল হতে পারে যা কমোডোর সি 64 এ চালানো যেতে পারে।

বিজয়ী মানদণ্ড

  • প্রোগ্রাম যা ক্ষুদ্রতম আউটপুট ফাইল জিততে পারে
  • যদি ইনপুট চিত্রের উপর নির্ভর করে আউটপুট ফাইলের আকার পৃথক হয় (উদাহরণস্বরূপ কারণ প্রোগ্রামটি চিত্রটি সংকুচিত করে), তবে 4 টিরও বেশি রঙ গণনা করে একটি 64x64 চিত্র উপস্থাপনের মাধ্যমে প্রোগ্রামটি তৈরি করা সবচেয়ে বড় সম্ভাব্য আউটপুট ফাইল

যাইহোক

স্ট্যাকওভারফ্লোতে এই প্রশ্নটি পড়ার সময় আমার কাছে নিম্নলিখিত প্রোগ্রামিং ধাঁধাটির ধারণা ছিল


আমি বিজয়ী শর্ত ট্যাগ যুক্ত করেছি (মেটাগল্ফ - সংক্ষিপ্ত আউটপুট সঙ্গে সংমিশ্রণে কোড-চ্যালেঞ্জ)। ইনপুট 64x64 চিত্র হিসাবে, আপনার কি কিছু উদাহরণ চিত্র আছে? এছাড়াও, ছবিটি দেখার সময় কি একই চিত্র থাকতে হবে? অথবা আউটপুট চিত্র এবং ইনপুট চিত্র পৃথক হতে পারে? আরও কংক্রিট হতে: ধরা যাক আমরা .exeচ্যালেঞ্জের অংশের জন্য কিছু প্রকারের কোড যুক্ত করেছি এবং এটি যখন দেখি তখন .pngএই .exeকোডের উপর ভিত্তি করে পরিবর্তিত পিক্সেল রয়েছে । এটি এখনও .pngদেখার মতো যতক্ষণ পর্যন্ত এটি অনুমোদিত ? আউটপুট চিত্রটিতেও কি কমপক্ষে 4 টি রঙ থাকতে হবে?
কেভিন ক্রুইজসেন

2
আপনি কীভাবে "সাধারণ চিত্র প্রদর্শক" সংজ্ঞায়িত করেন? উদাহরণস্বরূপ, এইচটিএমএল "কোড" সহ একটি ইন্টারনেট ব্রাউজার কি গণনা করে?
জো কিং

@ কেভিন ক্রুজসেন যখন চিত্র ফাইল হিসাবে ব্যাখ্যা করা হয়, আউটপুট ফাইলটি ইনপুট ফাইলের মতো একই চিত্রের প্রতিনিধিত্ব করবে: পিক্সেলগুলিতে একই প্রস্থ এবং উচ্চতা এবং প্রতিটি পিক্সেলের রঙ একই হবে। যদি ফাইল ফর্ম্যাটগুলি একই রঙের প্যালেটটি সমর্থন না করে তবে প্রতিটি পিক্সেলের রঙ যতটা সম্ভব সম্ভব হবে। এক্সিকিউটেবল ফাইল হিসাবে ব্যাখ্যা করা ফাইলটির ক্ষেত্রেও এটি একই। যদি আউটপুট ফাইলটি "পূর্ণ স্ক্রিন" প্রোগ্রামকে উপস্থাপন করে তবে এটি চিত্রটি স্ক্রিনের যে কোনও জায়গায় প্রদর্শিত হতে পারে (কেন্দ্রিক, উপরের-বাম প্রান্ত, ...) বা পুরো স্ক্রিন আকারে প্রসারিত করতে পারে।
মার্টিন রোজেনাউ

1
@ জোকিং "সাধারণ চিত্র দর্শকদের দ্বারা স্বীকৃত" অর্থ হ'ল ফাইল ফর্ম্যাটটি হয় বেশিরভাগ কম্পিউটারের দ্বারা প্রাক-ইনস্টল করা সফ্টওয়্যার (যেমন এইচটিএমএল) দ্বারা পড়া যেতে পারে বা প্রচুর ব্যবহারকারী ফাইলটি দেখতে একটি নিখরচায় সরঞ্জাম ডাউনলোড করে ( যেমন পিডিএফ)। আমি বলব যে এইচটিএমএল + জাভাস্ক্রিপ্ট কোড হিসাবে দেখা যেতে পারে, তবে "চিত্র প্রদর্শক" কোডটি সম্পাদন করা উচিত নয় ! সুতরাং এটি বলার অনুমতি দেওয়া হবে যে কোনও ওয়েব ব্রাউজারটি একটি "চিত্র প্রদর্শক", তবে এই ক্ষেত্রে এইচটিএমএল "কোড" নয়। বা আপনি বলতে পারেন যে এইচটিএমএল + জেএস "কোড", তবে এই ক্ষেত্রে ওয়েব ব্রাউজারটি কোনও "চিত্র প্রদর্শক" নয়।
মার্টিন রোজেনাউ

2
এমন একটি আকর্ষণীয় প্রশ্নটি বন্ধ দেখে দুঃখ হয়। আমি যতদূর বুঝতে পেরেছি, কোনও প্রশ্ন পুনরায় খোলার আগে যে কোনও উদ্বেগের সমাধান করা উচিত। মন্তব্যে মূল বিষয়গুলি হ'ল "সাধারণ চিত্র প্রদর্শক" শব্দটি, যা দ্বিধাগ্রস্থ হওয়ার পক্ষে যথেষ্টই যথেষ্ট দু: খজনক এবং চিত্রটি কোনও অবস্থায় কার্যকর হতে পারে (@ কেভিনক্রুইজসেনের উদ্বেগ অনুসারে) এক্সিকিউটেবল কোডের উপস্থিতি দ্বারা অবিচ্ছিন্নভাবে স্পষ্ট করার যোগ্য is । এই উদ্বেগের সমাধান করার কোনও সম্পাদনা কি যথেষ্ট হবে? (আমি "চার রঙের চারটি বর্ণ" অস্পষ্টতা বুঝতে না
পেরে

উত্তর:


5

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:

খুশী হলাম। আমি জুটি বিএমপি / এমএস-ডস সিওএম সম্পর্কেও ভাবছিলাম; এক সপ্তাহের মধ্যে উত্তর না থাকলে আমি তা বাস্তবায়ন করতাম। যাইহোক, আমার 10K এর চেয়ে অনেক বেশি প্রয়োজন হবে: কারণ আমি ধরে নিই নি যে নিবন্ধগুলি শূন্য-সূচনাযুক্ত, আমি ফাইল অফসেটে একটি লাফের নির্দেশ রেখেছি 2. এবং এই ক্ষেত্রটি বিএমপি ফাইলগুলিতে "ফাইলের আকার" হিসাবে ব্যাখ্যা করা হয়েছে, "ফাইলের আকার" ক্ষেত্রটি সঠিক ফাইলের আকারের প্রতিনিধিত্ব করে তা নিশ্চিত করার জন্য আমাকে "ডামি" বাইট দিয়ে বিএমপি ফাইলটি পূরণ করতে হবে।
মার্টিন রোজেনা

@MartinRosenau আমি আসলে ছিল না রেজিস্টার মূল্যবোধের কিছু যে আমি সাধারণত (যেমন প্রতি কি অনুমান fysnet.net/yourhelp.htm ), যেহেতু হেডার রেজিস্টার পরাস্ত, এবং এমনকি জন্য PSP প্রথম বাইট, necessating int 0x20উপর ret
গ্যাস্ট্রোপনার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.