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

Ваш аккаунт

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

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

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

Определения R,G,B цветов из BMP

57K
19 сентября 2011 года
sqwerty
34 / / 04.01.2011
Добрый день! Даже не знаю как вопрос поставить. В общем что в коде не так делаю?
Код:
struct RGB_BITMAP
{
    WORD  width;       // Ширина
    WORD  height;      // Высота
    WORD  uwidth;      // Используемая ширина
    WORD  uheight;     // Используемая высота
    BYTE  Tail;        // Хвост в конце строки
    LONG BufSize;      // Размер цветового буфера
    RGB_PIXEL * Data;  // Данные о цвете
        virtual ~RGB_BITMAP(){
                       free(Data);
                       Data = NULL;};
};
RGB_BITMAP m_Bmp;
BYTE  *m_arrpMapsRGB[3];
void ColorMaps ()
    {
        int i,j,k=0;
        BYTE *R,*G, *B;
        BYTE *p=(BYTE*)m_Bmp.Data;//Данные о цвете
        BYTE MemSize=sizeof(BYTE)*m_Bmp.uwidth*m_Bmp.uheight;

        R=(BYTE*)malloc(sizeof(MemSize));
        G=(BYTE*)malloc(sizeof(MemSize));
        B=(BYTE*)malloc(sizeof(MemSize));

        SHORT Tail=m_Bmp.Tail+(m_Bmp.width-m_Bmp.uwidth)*sizeof(RGB_PIXEL);
        for (i=0;i<m_Bmp.uheight;i++)
        {
            for (j=0;j<m_Bmp.uwidth;j++)
            {
                    B[k]=p[0];
                G[k]=p[1];
                R[k]=p[2];
                p+=sizeof(RGB_PIXEL);
                k++;
            };
            p+=Tail; // пропускаем концевой хвост
        };
        m_arrpMapsRGB[0]=R;
        m_arrpMapsRGB[1]=G;
        m_arrpMapsRGB[2]=B;
    };

Код компилируется, но при запуске пишет ошибка сегментирования. т.е. выход за предел массива. А где именно происходит, не могу понять.
57K
19 сентября 2011 года
sqwerty
34 / / 04.01.2011
мною были обнаружены следующие ошибки:
1. Вместо :
 
Код:
RGB_PIXEL * Data;  // Данные о цвете

Я прописал:
 
Код:
BYTE * Data;  // Данные о цвете

2. Вместо:
 
Код:
R=(BYTE*)malloc(sizeof(MemSize));
G=(BYTE*)malloc(sizeof(MemSize));
B=(BYTE*)malloc(sizeof(MemSize));

Надо было:
 
Код:
R=(BYTE*)malloc(MemSize);
G=(BYTE*)malloc(MemSize);
B=(BYTE*)malloc(MemSize);


Но, все равно где-то есть ошибка.
14
19 сентября 2011 года
Phodopus
3.3K / / 19.06.2008
Откройте для себя дебаггер
41K
20 сентября 2011 года
kisssko
108 / / 28.10.2010
А, собственно, что надо то? Что именно должен делать код?
57K
21 сентября 2011 года
sqwerty
34 / / 04.01.2011
Кажется тут я уже всё разобрался. Спасибо всем, что откликнулись. Код должен был выделить три цвета R,G,B и положить их в массив m_arrpMapsRGB[].
57K
22 сентября 2011 года
sqwerty
34 / / 04.01.2011
Все же тут есть ошибка. Т.е. мне кажется, что объект кончается не дожидая до конца цикла и указатель указывает на пустой объект или вне предела объекта..
57K
22 сентября 2011 года
sqwerty
34 / / 04.01.2011
Обнаружена ошибка.
Вместо:
 
Код:
BYTE MemSize=sizeof(BYTE)*m_Bmp.uwidth*m_Bmp.uheight;

Надо было:
 
Код:
int MemSize=sizeof(BYTE)*m_Bmp.uwidth*m_Bmp.uheight;
41K
22 сентября 2011 года
kisssko
108 / / 28.10.2010
О, наконец то дошло. :) Раскладывание цветовых составляющих по отдельности.
Только вот зачем так часто дёргать malloc, тогда как можно сделать так:

 
Код:
R=(BYTE*)malloc(sizeof(MemSize)*3);
        G=R+sizeof(MemSize);
        B=G+sizeof(MemSize);
57K
23 сентября 2011 года
sqwerty
34 / / 04.01.2011
 
Код:
R=(BYTE*)malloc(sizeof(MemSize)*3);
        G=R+sizeof(MemSize);
        B=G+sizeof(MemSize);

Так не работает.
6.2K
27 сентября 2011 года
abdyla_v
40 / / 02.02.2006
 
Код:
BYTE *p=(BYTE*)m_Bmp.Data;//Данные о цвете;

А где m_Bmp.Data берется? Где код заполнения m_Bmp ?
41K
27 сентября 2011 года
kisssko
108 / / 28.10.2010
Цитата: sqwerty
 
Код:
R=(BYTE*)malloc(sizeof(MemSize)*3);
        G=R+sizeof(MemSize);
        B=G+sizeof(MemSize);

Так не работает.



Ну да, поспешил, и не везде поправил копипасту. :) Сорри... Надо так:

 
Код:
R=(BYTE*)malloc(MemSize*3);
        G=R+sizeof(MemSize);
        B=G+sizeof(MemSize);


Да и эту строчку
 
Код:
BYTE MemSize=sizeof(BYTE)*m_Bmp.uwidth*m_Bmp.uheight;

Надо бы изменить на такую.
 
Код:
int MemSize=sizeof(BYTE)*m_Bmp.uwidth*m_Bmp.uheight;

Или 256 байт памяти хватит всем? ;)
Да и sizeof(BYTE), по моему, там лишнее. А значит так:
 
Код:
int MemSize=m_Bmp.uwidth*m_Bmp.uheight;

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