Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Есть у кого функция чтения bmp файла для C++(Dos)?

3.0K
28 июня 2006 года
ctraus
91 / / 16.06.2006
Есть у кого функция чтения bmp файла для C++(Dos)?
242
28 июня 2006 года
Оlga
2.2K / / 04.02.2006
ув. господин ctraus, кросспостинг на форуме запрещен.
вашу рему в разделе Студенты я удалила
11K
29 июня 2006 года
Ireul
90 / / 15.06.2006
[QUOTE=ctraus]Есть у кого функция чтения bmp файла для C++(Dos)?[/QUOTE]

BMP-файл имеет простую структуру, хорошо описанную в МСДН, после пары структурок описывающих размеры, цветность, палитру и прочую лабуду идёт собственно битмассив. в полноцветах он использует 24-битный режим(альфы в бмпхах нет).

Короче, слазил в МСДН:
Сам файл начинается с структа BITMAPINFOHEADER, в нём есть поле bfOffBits в котором хранится оффсет до цветовой информации.

Считай с налала файла эту структуру, пропусти bfOffBits байтов и дальше идёт собственно цветовая информация - она то тебе для отображения и нужна - грузи её в память и придумай как отображать.
3.0K
30 июня 2006 года
ctraus
91 / / 16.06.2006
Это понятно туплю я там где надо прочитать элемент этого массива.
16 цветов в 1 байте 2 цвета 1ые 4 один другие другой как нрмально считать с тем чтобы потом это типа:
putpixel(x,y,i); ?где I-цвет считаный из файла
13K
30 июня 2006 года
Dr_C++
40 / / 07.06.2006
[QUOTE=ctraus]Это понятно туплю я там где надо прочитать элемент этого массива.
16 цветов в 1 байте 2 цвета 1ые 4 один другие другой как нрмально считать с тем чтобы потом это типа:
putpixel(x,y,i); ?где I-цвет считаный из файла[/QUOTE]

Я туго понял что ты вообще написал (ты то хоть сам понял???)... Хоть пару запятых поставил бы для преличия;).

ну ладно, это замечание на будешее, а теперь по теме...

Вот тут я писал програмулину для раскодирования штрихкода, и использовал вот такую функцию для чтения строки из ВМР файла (кстати, разберался сам... Инфы в нете предостаточно)

Код:
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;
}


Но у меня был ньюанс в том, что даже если файл был не мнохромный, я все равно делал его таким, так что у мен один байт из массива соответствовал одному пикселю из картинки...
Так что тебе надо смотреть битность картинки, и обрабатывать информации в соответствии с тем, сколько байтов отвечает одному пикселю... Если картинка 24-битная, то каждый байт соответствует оттенку красного-синего-зеленого (или в другом порядке, поищи описание структуры ВМР файла). Тоесть тебе надо считывать по три байта из массива и это будет один пиксель картинки...
Блин, что-то сам стал запутываться... Но вроде так...:)
13K
30 июня 2006 года
Lucky_Strike
33 / / 04.06.2006
попробуй-ка продебажить вот такой вот shit

Код:
#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 );
}
13K
30 июня 2006 года
Lucky_Strike
33 / / 04.06.2006
void put_pixel( int x, int y, char *image, int bpp );
{
//псевдокод
//если bpp == 8 то setcolor(*image);
//если bpp == 24 setcolorRGB(image[0], image[1], image[2])
//если bpp == 16 setcolor16bpp(image[0] * image[1])
//иначе <мысль останавливается>
//putpixel(x,y);
}

Без гарантий само собой, только как направление к размышлению.. :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог