C#调用动态链接库(libpng.dll)将bmp格式图片转换为png格式
链接库下载编译
- libpng下载地址,我下载的是lpng1637.zip;
- zlib,我下载在是zlib1211.zip;
- 事实证明我只用到了libpng库,zlib没有用到,所以不用下载编译;
- 解压进入lpng1637\projects\vstudio文件夹下,打开vstudio.sln,下面有七个子工程,如下图所示,只需要将libpng设为启动项目进行编译;
- 注意你的解决方案配置是64位还是32位,取决于你你调用dll的工程是32位还是64位,我的是64位工程,所以采用64位编译环境。
- 编译后会生成如下文件,将libpng16.dll拷到你需要的地方即可。
bmp图像转换为png函数实现
- 直接在linpng工程下pngwrite.c中实现转换函数,以便后面好调用函数方便。
int PNGAPI
writePng(unsigned char* png_file_name, unsigned char* pixels, int width, int height, int bit_depth)
{
png_structp png_ptr = NULL;
png_infop info_ptr = NULL;
FILE *png_file = fopen(png_file_name, "wb");
if (!png_file)
{
return -1;
}
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_ptr == NULL)
{
printf("ERROR:png_create_write_struct/n");
fclose(png_file);
return 0;
}
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL)
{
printf("ERROR:png_create_info_struct/n");
png_destroy_write_struct(&png_ptr, NULL);
return 0;
}
png_init_io(png_ptr, png_file);
png_set_IHDR(png_ptr, info_ptr,width,height,bit_depth, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
png_colorp palette = (png_colorp)png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH * sizeof(png_color));
if (!palette)
{
fclose(png_file);
png_destroy_write_struct(&png_ptr, &info_ptr);
return -1;
}
png_set_PLTE(png_ptr, info_ptr, palette, PNG_MAX_PALETTE_LENGTH);
png_set_packing(png_ptr);
png_write_info(png_ptr, info_ptr);
png_bytepp rows = (png_bytepp)png_malloc(png_ptr, height * sizeof(png_bytep));
for (int i = height - 1; i >= 0; i--)
{
rows[height - 1 - i] = (png_bytep)(pixels + (i)* width * 3);
}
png_write_image(png_ptr, rows);
png_write_end(png_ptr, info_ptr);
free(rows);
png_free(png_ptr, palette);
palette = NULL;
png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(png_file);
return 0;
}
unity下C#调用动态链接库
[DllImport("libpng16")]
public static extern int writePng(string file_name,byte[] pixels,int width,int height,int bit_depth);
测试效果
- 测试结果,将一张bmp转为png压缩保存时间间隔在1.3~1.5秒之间,效率较低
- 可以参考LG模拟器中png保存方法,会不会快很多。