gpt4 book ai didi

c++ - 一个简单的 PNG 包装器。有人可以分享一个片段吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:56:20 25 4
gpt4 key购买 nike

我正在寻找一种将图像数据缓冲区放入 PNG 文件的方法,以及一种将 PNG 文件放入缓冲区的方法。

我想做的只有这两件事。

这将是一个使用 png.h 的非常简单的包装器。好吧,由于可怕的复杂 libpng API,这并不完全简单,但它的概念是。

我之前尝试过 DevIL。它比 libpng 更容易使用。尽管如此,我还是有issues用它。此外,DevIL 做得太多。我只需要基本的 PNG 格式支持,而不是其他 20 种格式。

然后我找到this page .我称赞 Pixel Fairy 和全能的 Google 为我提供了一个银盘上的实现......结果这搞砸了图像:在处理后的图像中,每条扫描线中的每四个像素都丢失了。通过阅读源代码,我相当确定这不是故意发生的!它应该将红色归零并将绿色设置为蓝色。那也没有发生。

我也尝试过 png++。我遇到的问题是我无法以兼容加载到 OpenGL 的格式从 PNG 中获取数据,我将不得不构建另一个缓冲区。它看起来很难看,但在我考虑再给 DevIL 一次机会之前,我肯定会再次尝试 png++。因为 png++ 至少起作用了。它还具有仅 header 方面的功能。不过,它确实产生了一堆编译器警告。

还有其他竞争者吗?任何直接使用 libpng 的人都会知道如何实现我的要求:一个函数接受一个文件名并填充一个 32-bpp 缓冲区并设置两个分辨率整数;一个函数需要一个 32-bpp 缓冲区、两个分辨率整数和一个文件名。

更新编辑:我找到了this .那里可能有东西。

最佳答案

tutorial似乎有你想要的。

来自链接:

 //Here's one of the pointers we've defined in the error handler section:
//Array of row pointers. One for every row.
rowPtrs = new png_bytep[imgHeight];

//Alocate a buffer with enough space.
//(Don't use the stack, these blocks get big easilly)
//This pointer was also defined in the error handling section, so we can clean it up on error.
data = new char[imgWidth * imgHeight * bitdepth * channels / 8];
//This is the length in bytes, of one row.
const unsigned int stride = imgWidth * bitdepth * channels / 8;

//A little for-loop here to set all the row pointers to the starting
//Adresses for every row in the buffer

for (size_t i = 0; i < imgHeight; i++) {
//Set the pointer to the data pointer + i times the row stride.
//Notice that the row order is reversed with q.
//This is how at least OpenGL expects it,
//and how many other image loaders present the data.
png_uint_32 q = (imgHeight- i - 1) * stride;
rowPtrs[i] = (png_bytep)data + q;
}

//And here it is! The actuall reading of the image!
//Read the imagedata and write it to the adresses pointed to
//by rowptrs (in other words: our image databuffer)
png_read_image(pngPtr, rowPtrs);

关于c++ - 一个简单的 PNG 包装器。有人可以分享一个片段吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9155586/

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