C++ Cimage的bmp图片转png,并透明
时间: 2023-08-16 09:05:47 浏览: 445
要将 BMP 图像转换为 PNG 格式并添加透明度,您可以使用 C++ 的第三方库,例如 libpng 和 zlib。以下是一个简单的示例代码,它使用这些库来执行所需的 BMP 到 PNG 转换和透明度添加:
```
#include <iostream>
#include <fstream>
#include <cstring>
#include <png.h>
#include "CImage.h"
void write_png_file(char* file_name, int width, int height, png_bytep* row_pointers)
{
FILE* fp = fopen(file_name, "wb");
if (!fp)
{
std::cerr << "Error: Failed to open PNG file for writing\n";
return;
}
png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
if (!png_ptr)
{
std::cerr << "Error: Failed to create PNG write structure\n";
fclose(fp);
return;
}
png_infop info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr)
{
std::cerr << "Error: Failed to create PNG info structure\n";
png_destroy_write_struct(&png_ptr, nullptr);
fclose(fp);
return;
}
if (setjmp(png_jmpbuf(png_ptr)))
{
std::cerr << "Error: Failed to initialize PNG write\n";
png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(fp);
return;
}
png_init_io(png_ptr, fp);
if (setjmp(png_jmpbuf(png_ptr)))
{
std::cerr << "Error: Failed to write PNG image header\n";
png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(fp);
return;
}
png_set_IHDR(png_ptr, info_ptr, width, height, 8, PNG_COLOR_TYPE_RGBA, PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
png_write_info(png_ptr, info_ptr);
if (setjmp(png_jmpbuf(png_ptr)))
{
std::cerr << "Error: Failed to write PNG image data\n";
png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(fp);
return;
}
png_write_image(png_ptr, row_pointers);
if (setjmp(png_jmpbuf(png_ptr)))
{
std::cerr << "Error: Failed to complete PNG write\n";
png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(fp);
return;
}
png_write_end(png_ptr, nullptr);
png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(fp);
}
void bmp_to_png_with_alpha(const char* bmp_file, const char* png_file)
{
CImage img;
if (!img.Load(bmp_file))
{
std::cerr << "Error: Failed to load BMP file\n";
return;
}
int width = img.GetWidth();
int height = img.GetHeight();
png_bytep* row_pointers = new png_bytep[height];
for (int y = 0; y < height; ++y)
{
row_pointers[y] = new png_byte[4 * width];
for (int x = 0; x < width; ++x)
{
COLORREF color = img.GetPixel(x, y);
png_byte red = GetRValue(color);
png_byte green = GetGValue(color);
png_byte blue = GetBValue(color);
png_byte alpha = (color != RGB(255, 0, 255)) ? 0xFF : 0x00;
png_bytep pixel = &(row_pointers[y][4 * x]);
pixel[0] = red;
pixel[1] = green;
pixel[2] = blue;
pixel[3] = alpha;
}
}
write_png_file(png_file, width, height, row_pointers);
for (int y = 0; y < height; ++y)
{
delete[] row_pointers[y];
}
delete[] row_pointers;
}
int main()
{
const char* bmp_file = "test.bmp";
const char* png_file = "test.png";
bmp_to_png_with_alpha(bmp_file, png_file);
return 0;
}
```
在这个示例中,我们首先使用 CImage 类加载 BMP 图像文件。然后,我们遍历每个像素,并将其值转换为 PNG 格式,同时添加透明度(即,如果像素值为 RGB(255, 0, 255),则将其 alpha 值设置为 0,否则将其 alpha 值设置为 255)。最后,我们使用 write_png_file() 函数将转换后的 PNG 图像写入磁盘。
请注意,该示例仅提供了一个基本的转换功能。如果您需要处理大量图像或需要更高级的功能(例如,调整大小、旋转或滤镜等),则可能需要使用更强大的图像处理库,例如 OpenCV 或 ImageMagick。
阅读全文