Witam, chciałbym prosić o pomoc w napisaniu programu w C++ za pomocą struktur, który będzie zamieniał na negatyw albo rozjaśniał obraz. Tak jak w temacie, obrazek jest z góry określony 320 x 200, 8-bitowy, szary.
Przykład :
boat.bmp
W internecie występuje masa takich programów, lecz są pisane nie według mojego wzoru, co bardzo utrudnia zrozumienie kodu. Moi wykładowcy nie tłumaczą nic, a wymagają.
Muszę się stosować do wzoru niżej przedstawionego (chodzi mi o struktury i wywołanie pliku, resztę dopisałem sam).
#include <stdio.h>
#include <dos.h>
#include <iostream>
/* File Header */
struct BMPFILEHEADER {
short type;
int fileSize;
short reserved0;
short reserved1;
int dataOffset;
};
/* Info Header */
struct BMPINFOHEADER {
int hdrSize;
int width;
int height;
short planes;
short depth;
int compression;
int bmpDataSize;
int hResolution;
int vResolution;
int nColors;
int nImportantColors;
};
struct RGB {
unsigned char R;
unsigned char G;
unsigned char B;
unsigned char rgbReserved;
};
int main(int argc, char *argv[], char *envp[])
{
int wybor=1;
FILE *bitmap_file; //Plik bitmapy
BMPFILEHEADER FileInfo; //nagłówek nr 1 bitmapy
BMPINFOHEADER PictureInfo; //nagłówek nr 2 bitmapy
//otwórz plik do odczytu w trybie binarnym "rb"
bitmap_file = fopen("c:\\Programy\\boat.bmp", "rb");
//odczytaj z pliku nagłówek nr 1 i zapamiętaj w zmiennej bmfh
fread(&bmfh, sizeof(BMPFILEHEADER), 1, bitmap_file);
//odczytaj z pliku nagłówek nr 2 i zapamiętaj w zmiennej bmih
fread(&bmih, sizeof(BMPINFOHEADER), 1, bitmap_file);
//zamknij plik
fclose(bitmap_file);
while(wybor==1 || wybor==2)
{
cout<<"Co chcesz zrobić ?"<<endl
<<"1. Rozjasnienie."<<endl
<<"2. Negatyw."<<endl
<<"3. Koniec programu.";
cin>>wybor;
switch(wybor)
{
case 1:
break;
case 2:
break;
case 3: system("pause");
return 0;
}
system("cls");
}
system("pause");
return 0;
}
Program miałby pokazywać otrzymany obraz za pomocą trybu 13h. Jako pomoc miałem podane dane kody:
#include <dos.h>
...
REGPACK regs;
regs.r_ax = 0x13;
intr(0x10, ®s);
unsigned char *video_memory = (BYTE *)0xA0000000L;
//ustaw lewy górny piksel obrazu na kolor 128
//aktualnej palety karty VGA
video_memory[0] = 128;
//ustaw prawy dolny piksel obrazu na kolor 255
//aktualnej palety karty VGA
video_memory[64000] = 255;
outportb(0x03C8, 0); //rozpocznij ustawianie palety od koloru nr 0
for (int i = 0; i < 255; i++) //ilość kolorów w palecie 8-bitowej
{
outp(0x03C9, palette[i].rgbRed * 63 / 255); //skalowana składowa R
outp(0x03C9, palette[i].rgbGreen * 63 / 255); //skalowana składowa
outp(0x03C9, palette[i].rgbBlue * 63 / 255); //skalowana składowa B
}
Niestety, brak pomocy wykładowców przyczynia się do braku zrozumienia danego kodu i sposobu jego wykorzystania. By był ktoś tak miły by wytłumaczyć mi oraz pomóc zrobić dany program?