gpt4 book ai didi

c++ - CImg 库在旋转时创建扭曲的图像

转载 作者:搜寻专家 更新时间:2023-10-31 01:06:13 26 4
gpt4 key购买 nike

我想使用 CImg 库 ( http://cimg.sourceforge.net/ ) 以任意角度旋转图像(图像由不应执行旋转的 Qt 读取):

QImage img("sample_with_alpha.png");
img = img.convertToFormat(QImage::Format_ARGB32);

float angle = 45;

cimg_library::CImg<uint8_t> src(img.bits(), img.width(), img.height(), 1, 4);
cimg_library::CImg<uint8_t> out = src.get_rotate(angle);

// Further processing:
// Data: out.data(), out.width(), out.height(), Stride: out.width() * 4

当角度设置为 0 时,“out.data()”中的最终数据是可以的。但对于其他角度,输出数据会失真。我假设 CImg 库在旋转期间改变了输出格式和/或步幅?

问候,

最佳答案

CImg 不以交错模式存储图像的像素缓冲区,如 RGBARGBARGBA... 而是使用逐 channel 结构 RRRRRRRR.....GGGGGGGGG......BBBBBBBBB......AAAAAAAAAA .我假设你的 img.bits() 指针指向具有交错 channel 的像素,所以如果你想将它传递给 CImg,你需要先置换缓冲区结构,然后才能应用任何 CImg方法。试试这个:

cimg_library::CImg<uint8_t> src(img.bits(), 4,img.width(), img.height(), 1);
src.permute_axes("yzcx");
cimg_library::CImg<uint8_t> out = src.get_rotate(angle);
// Here, the out image should be OK, try displaying it with out.display();
// But you still need to go back to an interleaved image pointer if you want to
// get it back in Qt.
out.permute_axes("cxyz"); // Do the inverse permutation.
const uint8_t *p_out = out.data(); // Interleaved result.

我想这应该会按预期工作。

关于c++ - CImg 库在旋转时创建扭曲的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21202635/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com