【问题标题】:Extract pixel value with libpng使用 libpng 提取像素值
【发布时间】:2015-06-25 18:14:59
【问题描述】:

我有一个正方形 (1024x1024) 8 位灰度图像,我试图将其用作“风景”(它是一个巨大的高度模型),而我想要做的只是得到类似

byte = pngimg.at(x, y)

我一直在搜索 libpng 的页面和谷歌搜索,但没有任何显示。在 Java 中,它就像缓冲图像一样简单。 png 的 C++ 等价物在哪里?

【问题讨论】:

  • 我的意思是8位灰度值。
  • 我已经有了 FILE* 来打开文件,但是我找不到任何关于实际提取图像数据的 libpng 文档,但这一切都是读取压缩字节。如果可能的话,我希望能够对包含传递坐标的块进行充气,获取 Grey-Byte,然后对块进行放气。
  • In Java it's as simple as a buffered image C++ 语言对图像类型一无所知。您可能想询问基本上包装 libpng 库的第三方库,以便像素访问成为库的工作,而不是您的工作。许多成像库利用现有的低级库,如 libpng、libtiff 等,并将所有功能封装在易于使用的函数和类中。
  • 这个例子可能对你有用:gist.github.com/niw/5963798
  • 你走了多远?如果您能够加载图像,则可以使用png_get_rows 来获取行指针列表,并索引到该行以获取特定的像素值。请参阅libpng.org/pub/png/libpng-manual.txt

标签: c++ image png pixel libpng


【解决方案1】:

C++ 不支持 STL 中的图像类型,因此您必须依赖一些外部库来读取像素。我曾经使用 OpenCV 库来做这件事,它的功能是imread。最近我在 C++11 中创建了一个非常简单的库,用于在 PNG 中加载图像,它仅依赖于 libPNG(和 STL)。从 PNG 加载像素数据的代码位于 github repo。它从向量中获取二进制数据并使用像素向量创建缓冲区。

注意 - 如果您使用 libPNG,您必须记住使用 png_destroy_read_struct 释放 libPNG 资源。当我忘记它时,我遇到了一些内存泄漏问题。

【讨论】:

    猜你喜欢
    • 2020-11-23
    • 2021-12-23
    • 2012-01-11
    • 2011-02-11
    • 2014-03-18
    • 2014-04-05
    • 2014-04-06
    • 2012-07-01
    • 1970-01-01
    相关资源
    最近更新 更多