Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Считывание bmp-файла в массив  (Прочитано 9917 раз)
0 Пользователей и 1 Гость смотрят эту тему.
larry
Участник

ua
Offline Offline

« : 02-09-2009 16:04 » 

Добрый вечер!Кто может мне объяснить где моя ошибка...Если использую такой подход:
Код: (C++)
int LoadBitmapFile(BITMAP_FILE_PTR bitmap, char *filename)
{
        FILE *file;

        if((file = fopen(filename, "rb")) == NULL)
                return 0;

        fread(&bitmap->bfh, sizeof(BITMAPFILEHEADER), 1, file);

        if(bitmap->bfh.bfType != BITMAP_ID)
        {
                fclose(file);
                return 0;
        }

        fread(&bitmap->bih, sizeof(BITMAPINFOHEADER), 1, file);

        fseek(file, -int(bitmap->bih.biSizeImage), SEEK_END);

        if(bitmap->bih.biBitCount == 24)
        {
                if(bitmap->buffer)
                        delete bitmap->buffer;

                if(!(bitmap->buffer = new UCHAR[bitmap->bih.biSizeImage]))
                {
                        fclose(file);
                        return 0;
                }

                fread(bitmap->buffer, sizeof(bitmap->bih.biSizeImage), 1, file);
        }
        else
        {
                fclose(file);
                return 0;
        }

        fclose(file);
        return 1;
}
то на экран выводится серый прямоугольник по размерам картинки...
А если использую такой подход:
Код: (C++)
int LoadBitmapFile(BITMAP_FILE_PTR bitmap, char *filename)
{
        int file;

        OFSTRUCT file_data;      
       
        if ((file = OpenFile(filename,&file_data,OF_READ))==-1)
           return 0;

        _lread(file, &bitmap->bfh,sizeof(BITMAPFILEHEADER));

        if (bitmap->bfh.bfType!=BITMAP_ID)
        {
           _lclose(file);
           return 0;
        }

        _lread(file, &bitmap->bih,sizeof(BITMAPINFOHEADER));

        if (bitmap->bih.biBitCount==24)
        {
                if (bitmap->buffer)
                   delete bitmap->buffer;

                if (!(bitmap->buffer = new UCHAR[bitmap->bih.biSizeImage]))
                {
                        _lclose(file);
                        return 0;
                }

                _lread(file,bitmap->buffer,bitmap->bih.biSizeImage);
        }
        else
           {
           
                        return 0;

           }

        _lclose(file);
        return 1;

}
то все работает...Помогите разобраться...
работаю в Visual Studio 2008
Изображение вывожу на экран функцией
Код: (C++)
void DrawBitmap(BITMAP_FILE_PTR bitmap, COLORREF color_key, HDC hdc)
{
        int red, green, blue, mask;

        for(int index=0,x=0,y=0; index<=bitmap->bih.biSizeImage; index += 3,x++)
        {
                red   = bitmap->buffer[index];
                green = bitmap->buffer[index+1];
                blue  = bitmap->buffer[index+2];

                if(RGB(red,green,blue) != color_key)
                        SetPixel(hdc,x,y,RGB(red,green,blue));

                if(!(index%bitmap->bih.biWidth))
                {
                        y++;
                        x=0;
                }
        }
}
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 02-09-2009 16:26 » 

larry, ну дык, берёшь отладчик и и по шагам выясняешь, откуда растут ноги серых пикселей )
Записан

larry
Участник

ua
Offline Offline

« Ответ #2 : 02-09-2009 16:49 » 

Ужо определил Да-да...
Записан
larry
Участник

ua
Offline Offline

« Ответ #3 : 02-09-2009 16:52 » 

Вместо fread(bitmap->buffer, sizeof(bitmap->bih.biSizeImage), 1, file); надо fread(bitmap->buffer, bitmap->bih.biSizeImage, 1, file);
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines