[英]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.