AnsiString ReadRawBMP(Graphics::TBitmap *pBitmap)
{
Byte* ptr;
AnsiString rezult;
int width,height;
height = pBitmap->Height/2;
ptr = (Byte*)pBitmap->ScanLine[height]; //Считываю строку из середины ВМР картинки
for (int x = 0; x <= pBitmap->Width/8; x++) //Потом я прошелся по этой
{ //строке и занес информацию о ее
rezult+=ByteToBin(ptr[x]); //структуре в результирующщую
} //строку 1-черное 0-белое
return rezult;
}
Есть у кого функция чтения bmp файла для C++(Dos)?
Есть у кого функция чтения bmp файла для C++(Dos)?
вашу рему в разделе Студенты я удалила
BMP-файл имеет простую структуру, хорошо описанную в МСДН, после пары структурок описывающих размеры, цветность, палитру и прочую лабуду идёт собственно битмассив. в полноцветах он использует 24-битный режим(альфы в бмпхах нет).
Короче, слазил в МСДН:
Сам файл начинается с структа BITMAPINFOHEADER, в нём есть поле bfOffBits в котором хранится оффсет до цветовой информации.
Считай с налала файла эту структуру, пропусти bfOffBits байтов и дальше идёт собственно цветовая информация - она то тебе для отображения и нужна - грузи её в память и придумай как отображать.
16 цветов в 1 байте 2 цвета 1ые 4 один другие другой как нрмально считать с тем чтобы потом это типа:
putpixel(x,y,i); ?где I-цвет считаный из файла
16 цветов в 1 байте 2 цвета 1ые 4 один другие другой как нрмально считать с тем чтобы потом это типа:
putpixel(x,y,i); ?где I-цвет считаный из файла[/QUOTE]
Я туго понял что ты вообще написал (ты то хоть сам понял???)... Хоть пару запятых поставил бы для преличия;).
ну ладно, это замечание на будешее, а теперь по теме...
Вот тут я писал програмулину для раскодирования штрихкода, и использовал вот такую функцию для чтения строки из ВМР файла (кстати, разберался сам... Инфы в нете предостаточно)
Код:
Но у меня был ньюанс в том, что даже если файл был не мнохромный, я все равно делал его таким, так что у мен один байт из массива соответствовал одному пикселю из картинки...
Так что тебе надо смотреть битность картинки, и обрабатывать информации в соответствии с тем, сколько байтов отвечает одному пикселю... Если картинка 24-битная, то каждый байт соответствует оттенку красного-синего-зеленого (или в другом порядке, поищи описание структуры ВМР файла). Тоесть тебе надо считывать по три байта из массива и это будет один пиксель картинки...
Блин, что-то сам стал запутываться... Но вроде так...:)
Код:
#include <stdio.h>
#include <stdlib.h>
void* load_bmp( char *s, int *w, int *h, short *bpp, int *len )
{
char* image;
FILE *f = fopen( s, "rb" );
if (!f) return 0;
fseek(f, 18, SEEK_SET ); fread(w, 4, 1, f);
fseek(f, 22, SEEK_SET ); fread(h, 4, 1, f);
fseek(f, 28, SEEK_SET ); fread(bpp, 2, 1, f);
printf( "w:%d, h:%d, bpp:%d\n", *w, *h, *bpp );
image = malloc( *len = (*bpp = ( *bpp == 15 ? 2 : *bpp/8 )) * (*w) * (*h) );
fseek(f, 51, SEEK_SET );
fread( image, 1, *len, f);
printf("*len == %d, *bpp == %d\n", *len, *bpp);
fclose(f);
return image;
}
int blit_bmp( int bellow_x, int bellow_y, char *image, int w, int h, int bpp )
{
int x = bellow_x,
y = bellow_y,
i, j;
for (i = 0; i < h; ++i, y -= i )
for (j = 0; j < w; ++j, x += j)
;// put_pixel( x, y, image+((w*i)+j)*bpp, bpp );
}
main()
{
int w, h, len;
short bpp;
char *image = load_bmp("horze.bmp", &w, &h, &bpp, &len);
if ( ! image)
return -1;
blit_bmp( 0, 599, image, w, h, bpp );
}
#include <stdlib.h>
void* load_bmp( char *s, int *w, int *h, short *bpp, int *len )
{
char* image;
FILE *f = fopen( s, "rb" );
if (!f) return 0;
fseek(f, 18, SEEK_SET ); fread(w, 4, 1, f);
fseek(f, 22, SEEK_SET ); fread(h, 4, 1, f);
fseek(f, 28, SEEK_SET ); fread(bpp, 2, 1, f);
printf( "w:%d, h:%d, bpp:%d\n", *w, *h, *bpp );
image = malloc( *len = (*bpp = ( *bpp == 15 ? 2 : *bpp/8 )) * (*w) * (*h) );
fseek(f, 51, SEEK_SET );
fread( image, 1, *len, f);
printf("*len == %d, *bpp == %d\n", *len, *bpp);
fclose(f);
return image;
}
int blit_bmp( int bellow_x, int bellow_y, char *image, int w, int h, int bpp )
{
int x = bellow_x,
y = bellow_y,
i, j;
for (i = 0; i < h; ++i, y -= i )
for (j = 0; j < w; ++j, x += j)
;// put_pixel( x, y, image+((w*i)+j)*bpp, bpp );
}
main()
{
int w, h, len;
short bpp;
char *image = load_bmp("horze.bmp", &w, &h, &bpp, &len);
if ( ! image)
return -1;
blit_bmp( 0, 599, image, w, h, bpp );
}
{
//псевдокод
//если bpp == 8 то setcolor(*image);
//если bpp == 24 setcolorRGB(image[0], image[1], image[2])
//если bpp == 16 setcolor16bpp(image[0] * image[1])
//иначе <мысль останавливается>
//putpixel(x,y);
}
Без гарантий само собой, только как направление к размышлению.. :)