2010-10-29 69 views
1

我想爲給定的jpg圖像創建一個avi文件。我正在閱讀jpg的圖書館,併爲它準備hbitmap。最後,我將它添加到創建avi文件。但是我的最終AVI文件包含倒置的圖像。我一直在bitmapheader中使用hight。仍然我的hbitmap被倒置。你能幫幫爲什麼錯誤爲什麼HBITMAP被倒置

這裏我給我實現

void makeVideo() 

{ 

GoldImage Test ; 

for(int i=0;i<10;i++) 

{ 

Test.SetImage(m_MyImage[i]) 

HBITMAP hBitmap; 
Test.GetBitMap(0,0,hBitmap); 

if(i==0) 

{ 

avi = CreateAvi("test.avi",1000,NULL); 
AVICOMPRESSOPTIONS opts; ZeroMemory(&opts,sizeof(opts)); 

SetAviVideoCompression(avi,hBitmap,&opts,true,NULL); 

} 

AddAviFrame(avi,hBitmap); 

} 

CloseAvi(); 

} 


void GoldImage::GetBitMap(HBITMAP &hBitmap) 

{ 

BITMAPINFOHEADER bmi; 

bmi.biSize = sizeof(BITMAPINFOHEADER); 
     bmi.biWidth = Width 
     **bmi.biHeight = (-1)*Height;** 
     bmi.biPlanes = 1;    
     bmi.biBitCount = 32;   
     **bmi.biCompression = BI_RGB;** 
     bmi.biSizeImage = 0;   
     bmi.biXPelsPerMeter = 0;  
     bmi.biYPelsPerMeter = 0;  
     bmi.biClrUsed = 0;   
     bmi.biClrImportant = 0; 



RGBQUAD *prgbaDIB = 0; 
     hBitmap = CreateDIBSection (NULL, (BITMAPINFO *)&bmi,   DIB_RGB_COLORS, (void**)&prgbaDIB, NULL, 0 ); 



const unsigned int columns = m_Image.columns(); 
     const unsigned int rows = m_Image.rows(); 

     RGBQUAD *pDestPixel = prgbaDIB; 

     for(unsigned int row = 0 ; row < rows ; row++) 
     { 
      const PixelPacket *pPixels = m_Image.getConstPixels(0,row,columns,1); 

for(unsigned long nPixelCount = columns; nPixelCount ; nPixelCount--) 
       { 
       pDestPixel->rgbRed = ScaleQuantumToChar(pPixels->red); 
       pDestPixel->rgbGreen = ScaleQuantumToChar(pPixels->green); 
       pDestPixel->rgbBlue = ScaleQuantumToChar(pPixels->blue); 
       pDestPixel->rgbReserved = 0; 
       ++pDestPixel; 
       ++pPixels; 
       } 

      } 

} 

由於提前代碼

+2

您是否知道在BMP文件中,行編號從底部開始? – ruslik 2010-10-29 13:22:16

回答

2

位圖有自己的掃描線存儲上下倒置。直接寫入像素時,必須對此進行補償。

0

我解決了我的問題。我反過來複制到另一個hbitmap。 是對的還是錯的?