tło
Istnieją .ZIP
pliki samorozpakowujące się . Zazwyczaj mają rozszerzenie .EXE
(i po uruchomieniu pliku zostaną rozpakowane), ale podczas zmiany ich nazwy .ZIP
można otworzyć plik za pomocą oprogramowania do rozpakowywania ZIP.
(Jest to możliwe, ponieważ .EXE
pliki wymagają określonego nagłówka, ale .ZIP
pliki wymagają określonego zwiastuna, dlatego możliwe jest zbudowanie pliku zawierającego zarówno .EXE
nagłówek, jak i .ZIP
zwiastun).
Twoje zadanie:
Utwórz program, który tworzy „samowyświetlające się” pliki graficzne:
- Program powinien pobrać obraz w formacie 64 x 64 (przynajmniej 4 kolory) jako dane wejściowe, a niektóre pliki „połączone” jako dane wyjściowe
- Plik wyjściowy programu zostanie rozpoznany przez zwykłe przeglądarki obrazów jako plik obrazu
- Podczas otwierania pliku wyjściowego za pomocą przeglądarki obrazów należy wyświetlić obraz wejściowy
Plik wyjściowy należy również rozpoznać jako plik wykonywalny dla dowolnego systemu operacyjnego lub typu komputera
(Jeśli tworzony jest plik dla nietypowego systemu operacyjnego lub komputera, dobrze byłoby, gdyby istniał emulator PC typu open source. Jednak nie jest to wymagane).
- Podczas wykonywania pliku wyjściowego należy również wyświetlić obraz wejściowy
- Prawdopodobnie konieczna jest zmiana nazwy pliku (na przykład z
.PNG
na.COM
) - Nie jest wymagane, aby program i jego plik wyjściowy działały w tym samym systemie operacyjnym; program może na przykład być programem Windows i plikami wyjściowymi, które można wykonać na Commodore C64.
Kryterium wygranej
- Wygrywa program, który tworzy najmniejszy plik wyjściowy
- Jeśli rozmiar pliku wyjściowego różni się w zależności od obrazu wejściowego (na przykład dlatego, że program kompresuje obraz), liczy się największy możliwy plik wyjściowy utworzony przez program reprezentujący obraz 64x64 z maksymalnie 4 kolorami
tak poza tym
Podczas czytania tego pytania na StackOverflow wpadłem na pomysł następującej łamigłówki programistycznej .
źródło
.exe
części wyzwania, a gdy oglądamy go jako.png
zmodyfikowane piksele oparte na tym.exe
kodzie. Czy jest to dozwolone, o ile nadal.png
możemy to zobaczyć? Czy obraz wyjściowy również musi mieć co najmniej 4 kolory?Odpowiedzi:
8086 MS-DOS .COM plik / BMP, rozmiar pliku wyjściowego = 2192 bajtów
Enkoder
Koder jest napisany w C. Przybiera dwa argumenty: plik wejściowy i plik wyjściowy. Plik wejściowy to obraz RAW RGB w formacie 64x64 (co oznacza, że jest to po prostu trojaczki 4096 RGB). Liczba kolorów jest ograniczona do 4, dzięki czemu paleta może być jak najkrótsza. Jest to bardzo proste w swoich działaniach; po prostu buduje paletę, upakowuje pary pikseli w bajtach i skleja razem z gotowymi nagłówkami i programem dekodującym.
Plik wyjściowy
Plik wyjściowy to plik BMP, którego nazwę można zmienić .COM i można go uruchomić w środowisku DOS. Po wykonaniu przejdzie w tryb wideo 13h i wyświetli obraz.
Plik BMP ma pierwszy nagłówek BITMAPFILEHEADER, który zawiera między innymi pole ImageOffset, które wskazuje, gdzie w pliku zaczynają się dane obrazu. Następnie pojawia się BITMAPINFOHEADER z różnymi informacjami de / / kodowania, a następnie paletą, jeśli jest używana. ImageOffset może mieć wartość, która wskazuje poza koniec jakichkolwiek nagłówków, co pozwala nam zrobić przerwę dla dekodera. Z grubsza:
Innym problemem jest wejście do dekodera. BITMAPFILEHEADER i BITMAPINFOHEADER można modyfikować, aby upewnić się, że są one legalnym kodem maszynowym (który nie generuje nieodzyskiwalnego stanu), ale paleta jest trudniejsza. Oczywiście moglibyśmy sztucznie wydłużyć paletę i umieścić tam kod maszynowy, ale zdecydowałem się zamiast tego użyć pól biXPelsPerMeter i biYPelsPerMeter, pierwszego do poprawnego wyrównania kodu, a drugiego do przeskoczenia do dekodera. Te pola będą oczywiście zawierać śmieci, ale każda przeglądarka obrazów, którą przetestowałem, wyświetla obraz w porządku. Jednak drukowanie może dawać dziwne wyniki.
O ile mi wiadomo, jest zgodny ze standardami.
Można by zrobić krótszy plik, gdyby
JMP
instrukcja została umieszczona w jednym z zarezerwowanych pól w BITMAPFILEHEADER. Pozwoliłoby nam to zapisać wysokość obrazu jako -64 zamiast 64, co w magicznej krainie czarów plików BMP oznacza, że dane obrazu są przechowywane odpowiednio do góry, co z kolei pozwoliłoby na uproszczony dekoder.Dekoder
Brak szczególnych sztuczek w dekoderze. Paleta jest wypełniana przez koder i pokazana tutaj z wartościami pozorowanymi. Może być nieco krótszy, jeśli nie wróci do DOS po naciśnięciu klawisza, ale bez niego testowanie nie byłoby zabawne. Jeśli uważasz, że musisz, możesz zastąpić ostatnie trzy instrukcje,
jmp $
aby zaoszczędzić kilka bajtów. (Jeśli to zrobisz, nie zapomnij zaktualizować nagłówków plików!)BMP przechowuje palety jako trojaczki BGR ( nie RGB), wypełnione zerami. To sprawia, że konfigurowanie palety VGA jest bardziej denerwujące niż zwykle. Fakt, że BMP są przechowywane do góry nogami, tylko poprawia smak (i rozmiar).
Wymienione tutaj w stylu NASM:
źródło
int 0x20
powyżejret
.