用c++编写PNG文件
Writing a PNG in C++
我正在尝试使用c++与Windows 7 64位的Visual Studio Express 2013将一些数据写入PNG文件。我知道要做到这一点,我需要使用外部库,但这就是我遇到一些困难的地方。
我尝试使用LodePNG -它看起来简单,轻量级,易于使用。问题是,它太简单了,似乎需要某种像素格式的数据,这与我所拥有的不匹配。我可以修改我的数据使其与LodePNG兼容,但我更愿意使用像libpng这样更灵活的库。
然而,我不理解构建或链接库的第一件事,而libpng在这方面被证明是一个绝对的噩梦。我试着遵循这个指南,并成功地生成了"libpng"。"png. lib"answers"png.h",但是当我尝试将这些文件包含在我的项目中时(我将这两个文件放在我的项目目录中,在我的头文件中添加了"png.h",并添加了"libpng. h")。到链接器的"附加依赖项"字段),我得到了大量的构建错误,特别是:
error C1083: Cannot open include file: 'pnglibconf.h': No such file or directory
谁能告诉我如何安装libpng,指导我一个关于这个主题的好指南(我对缺乏指南感到惊讶…),或者推荐一个不同的(轻量级,易于安装)PNG库?我要疯了
LodePNG就像你说的那么简单。我以前也用过。以防万一你改变主意,决定将你拥有的数据编码成正确的格式(假设它是BGRA
)。下面的代码将根据需要将BGRA格式转换为RGBA。
std::vector<std::uint8_t> PngBuffer(ImageData.size());
for(std::int32_t I = 0; I < Height; ++I)
{
for(std::int32_t J = 0; J < Width; ++J)
{
std::size_t OldPos = (Height - I - 1) * (Width * 4) + 4 * J;
std::size_t NewPos = I * (Width * 4) + 4 * J;
PngBuffer[NewPos + 0] = ImageData[OldPos + 2]; //B is offset 2
PngBuffer[NewPos + 1] = ImageData[OldPos + 1]; //G is offset 1
PngBuffer[NewPos + 2] = ImageData[OldPos + 0]; //R is offset 0
PngBuffer[NewPos + 3] = ImageData[OldPos + 3]; //A is offset 3
}
}
std::vector<std::uint8_t> ImageBuffer;
lodepng::encode(ImageBuffer, PngBuffer, Width, Height);
lodepng::save_file(ImageBuffer, "SomeImage.png");
你也可以直接做:
for(std::int32_t I = 0; I < Height; ++I)
{
for(std::int32_t J = 0; J < Width; ++J)
{
std::size_t OldPos = (Height - I - 1) * (Width * 4) + 4 * J;
std::size_t NewPos = I * (Width * 4) + 4 * J;
std::swap(ImageData[NewPos + 0], ImageData[ImageData + 2]);
}
}
考虑用这里指定的NetPBM/PBMplus格式编写文件。这是非常简单的,你不需要一个库,因为文件是如此直接。维基百科的文章在这里显示了格式。
下面是一个简单的例子:
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *imageFile;
int x,y,pixel,height=100,width=256;
imageFile=fopen("image.pgm","wb");
if(imageFile==NULL){
perror("ERROR: Cannot open output file");
exit(EXIT_FAILURE);
}
fprintf(imageFile,"P5n"); // P5 filetype
fprintf(imageFile,"%d %dn",width,height); // dimensions
fprintf(imageFile,"255n"); // Max pixel
/* Now write a greyscale ramp */
for(x=0;x<height;x++){
for(y=0;y<width;y++){
pixel=y;
fputc(pixel,imageFile);
}
}
fclose(imageFile);
}
一旦你有了PBM/PGM格式的文件,使用ImageMagick(这里)用一个简单的命令转换为PNG:
convert file.pgm file.png
缺少头文件可能是因为您还需要指定附加的include目录来指向libpng的头文件。看起来你可能连对了。
我已经有一段时间没有在visual studio中这样做了,但是在项目配置中应该有一个字段。
- 从存储为 Windows 资源 (c++) 的 png 中获取 png 文件数据
- 使用 stbi_write_png,如何将 0 和 1 的矩形字节数组转换为单色 png 文件?
- 将 FFMPEG 帧写入 png/jpeg 文件
- 如何启用libMagick++以保存.png文件格式
- 无法在CLion(macOS)上打开带有CImg的.png文件
- 尝试使用 CPP 在一个 Qt 窗口中显示多个 png 文件
- 我正在尝试SDL_DisplayFormat一个.png文件,我想,我可能缺少依赖项
- 如何在使用 c++/COM 发送时在电子邮件中插入/嵌入图像文件(.png)
- 从.ppm转换为.png文件
- 未找到"png.h"文件,当包含在Qt小部件项目中时
- 将较小的PNG文件组合在C 中的较大PNG文件中
- 使用膨胀来解压缩 png 文件
- 从 cin 读取 PNG 文件
- 以编程方式馈送 KML 文件并检索/生成.png文件
- SDL_Image libpng 错误:不是 PNG 文件
- 如何将 pcl::直方图保存为 PNG 或 JPG 文件
- 使用 QPixmap 和 QLabel 在 Qt Creator 中以编程方式添加图像文件 (.PNG)
- 如何在生成文件中将.png列表转换为 pdf 列表
- 使用 Allegro 5 加载.png图像文件
- 使用 C++、libpng 和 OpenMP 并行创建 PNG 文件