【问题标题】:Use libpng to resize (bicubic) a list of images使用 libpng 调整(双三次)图像列表的大小
【发布时间】:2012-03-24 17:36:22
【问题描述】:

有人可以指点我一个教程,其中解释了如何使用 libpng 和 png++ 在图像上应用双三次调整大小吗?我花了将近三个小时寻找一些东西,但找不到。也许是因为我不知道去哪里找。

图像 (48 bit image) 用libpng 读取,然后读入QImage 用于输出。如果我在图像上使用QImage::scaled,则会丢失像素信息,并且图像对我需要的东西没有用处。

我使用 png::rgba_pixel_16 像素读取和操作图像 - 像这样读取它:

png::image< png::rgba_pixel_16 > myImage(myFile.toAscii());

引用另一个答案:

QImage 中每个组件格式没有 16 位。您可以获得的最多是 QImage::Format_ARGB32 每个组件 8 位。即使您使用 8 位索引模式,颜色表也不支持每个组件超过 8 位。此外,QImageIOHandler 类是根据 QImage 工作的,因此很遗憾,您无法创建自定义图像格式插件来处理每个颜色分量 16 位。

最后一句话解释了为什么我不能为此使用 QImage。

【问题讨论】:

    标签: c++ qt libpng


    【解决方案1】:

    Qt 不需要 libpng。

    随便用

    QImage QImage::scaled ( const QSize & size, Qt::AspectRatioMode aspectRatioMode, Qt::TransformationMode transformMode ) const
    

    使用transformMode = Qt::SmoothTransformation 进行双线性缩放。

    【讨论】:

    • 我知道,我已经尝试过了,但是由于某种原因,它没有给我预期的结果。我认为它必须具有位深度。
    • 究竟是什么问题?对此提出问题可能会很有趣......
    • 图像(48位图像)用libpng读取,然后读入QImage输出。如果我在图像上使用QImage::scaled,像素信息就会丢失,图像对我需要的东西没有用处。
    • 这个问题是关于双三次,而不是双线性缩放。我希望找到使用 Qt 执行此操作的答案,但我开始认为除了使用 OpenCV 之类的第三方 api 执行缩放,然后转换为 QImage 之外,没有答案。
    【解决方案2】:

    如果您只想以编程方式调整图像大小,请查看imagemagick

    【讨论】:

    • 谢谢,但需要使用 QT。
    • Qt 不支持 48bpp 图像。快速浏览文档 libpng 后,AFAICT 无法进行缩放。你“需要为此使用Qt”是什么意思?使用 Qt 调用 imagemagick :-)
    【解决方案3】:

    为什么需要 libpng?您可以只读取数组中的图像,然后对其执行调整大小,您不需要 libpng,在读取图像后它变得独立于格式...

    【讨论】:

    • 我用 png::rgba_pixel_16 像素读取和操作图像 - 像这样读取它: png::image myImage(myFile.toAscii());这给了我我需要的质量(我认为是 64 位??但我不确定,问题是结果还可以,但太大了。)
    猜你喜欢
    • 2011-04-06
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 2018-09-27
    • 1970-01-01
    相关资源
    最近更新 更多