2012-07-05 67 views
4

我有bytearray其中每三個字節描述1像素(RGB)。任務是將其轉換爲JPEG或PNG。實際上,我正在使用Zint(開源lib用於生成條形碼),它使用libpng生成圖像文件並將其保存到文件系統,但是在Zintthe函數png_plot()中除生成圖像外,還將其保存在不受歡迎的磁盤上。原始位圖數據爲JPEG或PNG C++

作爲結果我認爲有兩種方式:
1.從位圖的bytearray到bmp - > JPEG/PNG(使用一些其它IIb)的
2.寫入鉤或一些類似png_plot()

你能給我一些建議嗎? 謝謝。

UPD:用於@peacemaker


FILE *f;
zint_symbol *my_symbol;
my_symbol = ZBarcode_Create();
ZBarcode_Encode_and_Buffer(my_symbol, (unsigned char *)argv[1], 0, 0);
f = fopen("bitmap.bmp", "w");
fwrite(my_symbol->bitmap, sizeof(*(my_symbol->bitmap)), my_symbol->bitmap_height * my_symbol->bitmap_width, f);
ZBarcode_Delete(my_symbol);
fclose(f);
+0

你能證明你的代碼正在使用? – peacemaker 2012-07-05 18:58:52

回答

3

爲了圖像格式之間進行轉換,最簡單的方法將使用由MFCATL共享和在頭文件atlimage.h定義的類CImage

CImage image; 
HRESULT res = image.Load("in.bmp"); 
image.Save("out.jpg"); 
image.Save("out.gif"); 
image.Save("out.png"); 
image.Save("out.tif"); 





如果你有一個RGB緩衝區,並希望創建位圖:只要創建和位圖信息頭保存到一個文件和RGB緩衝區添加到它。

要創建可以使用BITMAPFILEHEADERBITMAPINFOHEADERRGBQUAD結構從GDI在頭WINGDI.H

下面是對如何填充標題數據的示例中定義的報頭:

BITMAPINFOHEADER bmpInfoHdr; 

bmpInfoHdr.biSize = sizeof(BITMAPINFOHEADER); 
bmpInfoHdr.biHeight = nHeight; 
bmpInfoHdr.biWidth = nWidthPadded; 
bmpInfoHdr.biPlanes = 1; 
bmpInfoHdr.biBitCount = bitsPerPixel;   
bmpInfoHdr.biSizeImage = nHeight * nWidthPadded * nSPP; 
bmpInfoHdr.biCompression = BI_RGB; 
bmpInfoHdr.biClrImportant = 0; 
bmpInfoHdr.biClrUsed = 0; 
bmpInfoHdr.biXPelsPerMeter = 0; 
bmpInfoHdr.biYPelsPerMeter = 0; 
bmpFileHdr.bfType = BITMAP_FORMAT_BMP; 
bmpFileHdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + bmpInfoHdr.biSize + 
         sizeof(RGBQUAD)*numColors + bmpInfoHdr.biSizeImage); 
bmpFileHdr.bfReserved1 = 0; 
bmpFileHdr.bfReserved2 = 0; 
bmpFileHdr.bfOffBits = (DWORD) (sizeof(BITMAPFILEHEADER) + bmpInfoHdr.biSize + 
         sizeof(RGBQUAD)*numColors); 


考慮到位圖是顛倒存儲的,並且圖像的寬度必須與除RLE壓縮位圖之外的DWORD對齊(它們必須是4個字節的倍數,如有必要添加填充)。

if ((nWidth%4) != 0) 
    nPadding = ((nWidth/4) + 1) * 4; 

當保存緩衝區,需要填充添加到每一行...


彙總,這些都是必要的步驟來創建從RGB緩衝的位圖文件:

//1. create bmp header 

//2. save header to file: 
write(file, &bmpFileHdr, sizeof(BITMAPFILEHEADER)); 
write(file, &bmpInfoHdr, sizeof(BITMAPINFOHEADER)); 
write(file, &colorTable, numColors * sizeof(RGBQUAD)); 

//3. add rgb buffer to file: 
for(int h=0; h<nHeight; h++) { 
    for(int w=0; w<nWidth; w++) { 
     //3.a) add row to file 
     //3.b) add padding for this row to file 
    } 
} 
0

我使用了ATL中的CImage類。

int width=0, height=0; 
char * val = "9788994774480"; 
zint_symbol *my_symbol; 
my_symbol = ZBarcode_Create(); 

//ZBarcode_Encode_and_Buffer(my_symbol,(unsigned char *) val, 0, 0); 
ZBarcode_Encode(my_symbol, (unsigned char *) val, 0); 
ZBarcode_Buffer(my_symbol, 0); 

height = my_symbol->bitmap_height; 
width = my_symbol->bitmap_width; 
char * imgBits = my_symbol->bitmap; 

CImage img; 
img.Create(width, height, 24 /* bpp */, 0 /* No alpha channel */); 

int nPixel = 0; 
for(int row = 0; row < height; row++) 
{ 
    for(int col = 0; col < width; col++) 
    { 
     BYTE r = (BYTE)imgBits[nPixel]; 
     BYTE g = (BYTE)imgBits[nPixel+1]; 
     BYTE b = (BYTE)imgBits[nPixel+2]; 
     img.SetPixel(col, row , RGB(r, g, b)); 

     nPixel += 3; 
    } 
} 

img.Save("CImage.bmp", Gdiplus::ImageFormatBMP); 

ZBarcode_Delete(my_symbol); 
0

有沒有辦法做到這一點,而不是使用SetPixel?我遇到SetPixel的主要性能問題,需要一種替代方法...我嘗試使用CreateDIBSection無濟於事。條形碼顯示傾斜且不可用。這裏是我的代碼:

void *bits = (unsigned char*)(my_symbol->bitmap); 
HBITMAP hBitmap = CreateDIBSection(pDC->GetSafeHdc(), &info, DIB_RGB_COLORS, (void **)&pDestData, NULL, 0); 
memcpy(pDestData, my_symbol->bitmap, info.bmiHeader.biSizeImage); 
img.Attach(hBitmap); 

產生相同的結果的另一種選擇是這樣的:

BITMAPINFO info; 
    BITMAPINFOHEADER BitmapInfoHeader;  
    BitmapInfoHeader.biSize = sizeof(BITMAPINFOHEADER); 
    BitmapInfoHeader.biWidth = my_symbol->bitmap_width; 
    BitmapInfoHeader.biHeight = -(my_symbol->bitmap_height); 
    BitmapInfoHeader.biPlanes = 1; 
    BitmapInfoHeader.biBitCount = 24; 
    BitmapInfoHeader.biCompression = BI_RGB; 
    BitmapInfoHeader.biSizeImage = 0; 
    BitmapInfoHeader.biXPelsPerMeter = 0; 
    BitmapInfoHeader.biYPelsPerMeter = 0; 
    BitmapInfoHeader.biClrUsed = 0; 
    BitmapInfoHeader.biClrImportant = 0; 

    info.bmiHeader = BitmapInfoHeader; 

    HBITMAP hbmp = CreateDIBitmap(dc, &BitmapInfoHeader, CBM_INIT, (LPVOID *)my_symbol->bitmap, (LPBITMAPINFO)&info, DIB_RGB_COLORS); 
    img.Attach(hbmp); 
+0

如果您有新問題,請點擊[問問題](http://stackoverflow.com/questions/ask)按鈕。如果有助於提供上下文,請包含此問題的鏈接。 – 2015-06-22 11:46:21

+0

明白了,謝謝... – 2015-06-22 12:01:48

相關問題