2010-10-29 36 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。 是对的还是错的?