GetDIBits GIF форматы
От: Annuta  
Дата: 27.02.07 07:44
Оценка:
Привет народ... У меня очередная головная боль... Вот решила поменять в своём коде 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;        
        };

Работает оочень шустро.. НО оказывается что он одни анимированные гифы отображает правильно и цвета и координаты а другие оочень криво..!!! ну софсем криво..! краски черно-белые... и всё на перекосяк. . . От размера и разрешения не зависит... ГУРУ откликнитесь — у кого-нить была такая проблема..??? почему такое безобразие происходит ???
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.