簡體   English   中英

從RGBQUAD指針創建Magick ++圖像

[英]Create a Magick++ Image from an RGBQUAD pointer

我需要將RGBQUAD指針轉換為Magic::Image 我嘗試了下面的代碼。 但是,它與Magick::ErrorCorruptImage崩潰

Blob blob = Blob(pBuffer, width*height*sizeof(RGBQUAD));
Image img;
img.size(Geometry(width, height));
img.magick("RGBA");
img.read(blob);

那么如何將RGBQUAD數組轉換為Magick :: Image?

我認為該錯誤是由默認為Quantum大小的“ RGBA”格式引起的。 通常是16Q

只需將Magick::Image.depth設置為8Q因為RGBQUAD應該是BYTE數據類型。

Blob blob = Blob(pBuffer, width*height*sizeof(RGBQUAD));
Image img;
img.size(Geometry(width, height));
img.depth(8);
img.magick("RGBA");
img.read(blob);

... 但是 ...在RGBQUAD ,最后一個字節被保留,而不是alpha通道。 引用文檔...

保留

該成員已保留,並且必須為零。

這會使傳遞給ImageMagick的任何斑點透明。

我建議將數據處理到新緩沖區,並確保最后一個字節完全不透明。

例如...

// Note: I'm using data type `uint8_t' over `BYTE' for no particular reason.
size_t rgbquad_size = sizeof(RGBQUAD);
size_t total_bytes = width * height * rgbquad_size;
uint8_t * pCopyBuffer = new uint8_t[total_bytes];
for (size_t cursor = 0; cursor < total_bytes; ++cursor) {
    if (cursor % rgbquad_size < rgbquad_size - 1) {
        pCopyBuffer[cursor] = pBuffer[cursor];
    } else {
        pCopyBuffer[cursor] = 0xFF;
    }
}
Blob blob = Blob(pCopyBuffer, total_bytes);

根據評論編輯

如果將pBuffer定義為RGBQUAD * ,則對它們進行迭代並分配alpha通道值會更容易。

for (size_t cursor = 0; cursor < width*height; ++cursor)
    pBuffer[cursor].rgbReserved = 0xFF; // Set Alpha

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM