gpt4 book ai didi

c++ - 将 Leptonica Pix 对象转换为 QPixmap(或其他图像对象)

转载 作者:太空宇宙 更新时间:2023-11-04 14:56:49 33 4
gpt4 key购买 nike

我正在使用 Leptonica 库处理一些图片。之后我想在我的 QT GUI 中显示它们。 Leptonica 使用他们自己的图像格式 Pix,而 QT 使用他们自己的格式 QPixmap。目前对我来说唯一的方法是将处理后的图片保存为文件(如 bmp ),然后使用 QT 函数调用再次加载它们。现在我想在我的代码中转换它们,所以我不需要绕道将它们保存在文件系统上。任何想法如何做到这一点?

最好的问候

//编辑:

好的,正如已经建议的那样,我尝试将 PIX* 转换为 QImage。PIX* 定义如下:

http://tpgit.github.com/Leptonica/pix_8h_source.html

struct Pix
{
l_uint32 w; /* width in pixels */
l_uint32 h; /* height in pixels */
l_uint32 d; /* depth in bits */
l_uint32 wpl; /* 32-bit words/line */
l_uint32 refcount; /* reference count (1 if no clones) */
l_int32 xres; /* image res (ppi) in x direction */
/* (use 0 if unknown) */
l_int32 yres; /* image res (ppi) in y direction */
/* (use 0 if unknown) */
l_int32 informat; /* input file format, IFF_* */
char *text; /* text string associated with pix */
struct PixColormap *colormap; /* colormap (may be null) */
l_uint32 *data; /* the image data */
};

虽然 QImage 为我提供了这样的方法:

http://developer.qt.nokia.com/doc/qt-4.8/qimage.html#QImage-7

QImage ( const uchar * data, 
int width,
int height,
int bytesPerLine,
Format format )

我假设我不能在调用构造函数时将数据从 PIX 复制到 QImage。我想我需要逐个像素地填充 QImage,但实际上我不知道怎么做?我需要遍历所有坐标吗?我如何看待位深度?这里有什么想法吗?

最佳答案

I use这用于将 QImage 转换为 PIX:

PIX* TessTools::qImage2PIX(QImage& qImage) {
PIX * pixs;
l_uint32 *lines;

qImage = qImage.rgbSwapped();
int width = qImage.width();
int height = qImage.height();
int depth = qImage.depth();
int wpl = qImage.bytesPerLine() / 4;

pixs = pixCreate(width, height, depth);
pixSetWpl(pixs, wpl);
pixSetColormap(pixs, NULL);
l_uint32 *datas = pixs->data;

for (int y = 0; y < height; y++) {
lines = datas + y * wpl;
QByteArray a((const char*)qImage.scanLine(y), qImage.bytesPerLine());
for (int j = 0; j < a.size(); j++) {
*((l_uint8 *)lines + j) = a[j];
}
}
return pixEndianByteSwapNew(pixs);
}

这用于将 PIX 转换为 QImage:

QImage TessTools::PIX2QImage(PIX *pixImage) {
int width = pixGetWidth(pixImage);
int height = pixGetHeight(pixImage);
int depth = pixGetDepth(pixImage);
int bytesPerLine = pixGetWpl(pixImage) * 4;
l_uint32 * s_data = pixGetData(pixEndianByteSwapNew(pixImage));

QImage::Format format;
if (depth == 1)
format = QImage::Format_Mono;
else if (depth == 8)
format = QImage::Format_Indexed8;
else
format = QImage::Format_RGB32;

QImage result((uchar*)s_data, width, height, bytesPerLine, format);

// Handle pallete
QVector<QRgb> _bwCT;
_bwCT.append(qRgb(255,255,255));
_bwCT.append(qRgb(0,0,0));

QVector<QRgb> _grayscaleCT(256);
for (int i = 0; i < 256; i++) {
_grayscaleCT.append(qRgb(i, i, i));
}
if (depth == 1) {
result.setColorTable(_bwCT);
} else if (depth == 8) {
result.setColorTable(_grayscaleCT);

} else {
result.setColorTable(_grayscaleCT);
}

if (result.isNull()) {
static QImage none(0,0,QImage::Format_Invalid);
qDebug() << "***Invalid format!!!";
return none;
}

return result.rgbSwapped();
}

关于c++ - 将 Leptonica Pix 对象转换为 QPixmap(或其他图像对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8655772/

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