Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GIF GetDIBits проблема с форматом 
:(
    Опции темы
Korman
Дата 27.2.2007, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 12.9.2006
Где: г. Смоленск

Репутация: нет
Всего: нет



Привет народ... У меня очередная головная боль... Вот решила поменять в своём коде GetPixel на GetDIBits 
  и заменила ... 
Код

HBITMAP bmp;
                //Грузим из файла в DDB
                bmp =  m_hBitmap;
  
                SelectObject(m_hMemDC, bmp);                 //Назначаем DC для нашего битмапа
                tagBITMAP bmInfo;                            
                GetObject(bmp, sizeof(bmInfo), &bmInfo); //Получаем инфу о DDB

            BITMAPINFO DIBInfo;
            memset(&DIBInfo, 0, sizeof(DIBInfo)); //Готовим структуру для создания DIB.

  DIBInfo.bmiHeader.biWidth         = bmInfo.bmWidth;
  DIBInfo.bmiHeader.biHeight        = bmInfo.bmHeight;
  DIBInfo.bmiHeader.biPlanes        = 1;      // всегда 1
  DIBInfo.bmiHeader.biCompression   = BI_RGB; // без компрессии
  DIBInfo.bmiHeader.biBitCount      = 24;     // три байта на пиксель
  DIBInfo.bmiHeader.biSize          = sizeof(DIBInfo.bmiHeader);
  DIBInfo.bmiHeader.biXPelsPerMeter = 132;   // пикселей на метр, гор.    
  DIBInfo.bmiHeader.biYPelsPerMeter = 132;   // пикселей на метр, верт. 
  DIBInfo.bmiHeader.biClrUsed = 0;

BYTE* pBits  = NULL;     //тут будет растр DIB 
HBITMAP dib  = NULL;    //Хендл DIB вдруг понадобится :)

    
//Создаем пустой DIB в памяти на основе установленых параметров.
//dib = CreateDIBSection(m_hMemDC, &DIBInfo, DIB_RGB_COLORS, (VOID**)&pBits, 0, 0);
    
pBits = new BYTE [132*132*3];


   //Конвертируем DDB в DIB указанного формата.
int gg=GetDIBits(m_hMemDC, bmp, 0, bmInfo.bmHeight - 1, pBits, &DIBInfo, DIB_RGB_COLORS);
 
    rgb arr[132][132]; 
    int c = 0;int a=0;
    for (int i = 0; i <  bmInfo.bmWidth; i++) 
                {     
                    for (int j = 0; j < bmInfo.bmHeight; j++) 
                    { 
                        COLORREF cr = GetPixel(m_hMemDC,j,i); 
                        arr[i][j].r = GetRValue(cr); 
                        arr[i][j].g = GetGValue(cr); 
                        arr[i][j].b = GetBValue(cr); //Это конечный массив
                        if((pBits[c] != arr[i][j].r) && (pBits[c+1] != arr[i][j].g) && (pBits[c+2] != arr[i][j].b))
                        {
                            a++;
                        }
                        c += 3;
                    }
                    
                }
    
a=0;
    //GETFIRSTTICK();    
     

    //GETSECONDTICKMESSAGE();

    
      ///////////////////////////////////////////////////////
        c=0;    
        for (int i = 0; i < bmInfo.bmHeight; i++) 
        {     
                int k = 0;
                unsigned int x1,y;
                unsigned char buff[267];

                    buff[0] = 267;
                    buff[1] = 1;
                    buff[2] = i;

                for (int j = 0; j < bmInfo.bmWidth; j++) 
                { 
                    x1=0;                    
                    y=pBits[c+2];
                    y>>=3;
                    y&=0x1F;
                    y<<=11;
                    x1+=y;

                    y=pBits[c+1];
                    y>>=3;
                    y&=0x3f;
                    y<<=6;
                    x1+=y;

                    y=pBits[c];
                    y>>=3;
                    y&=0x1f;
                    x1+=y;
                    y=x1; 

                    y>>=8;

                    y&=0xff; 
                                            
                    buff[k+3]=(unsigned char) (y);
                    y=x1;  
                    y&=0xff;  

                    buff[k+4]=(unsigned char) (y);

                    k = k + 2; 
                    c += 3;
                }    
                    x.Write(0,buff,267);//Пишем в порт растр
            }
                
                delete [] pBits;    
        };

Работает оочень шустро.. НО оказывается что он одни анимированные гифы отображает правильно и цвета и координаты а другие оочень криво..!!! ну софсем криво..! краски черно-белые... и всё на перекосяк. . . От размера и разрешения не зависит...  ГУРУ откликнитесь - у кого-нить была такая проблема..??? почему такое безобразие происходит ???  
PM MAIL   Вверх
GremlinProg
Дата 28.2.2007, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: нет
Всего: 106





--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0994 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.