c语言环境BMP格式怎样换成png格式?!

jcreatorqijiashe 2009-02-04 09:03:49
是c语言环境!不是C++或者MFC环境! 论坛上的帖子都看过了,都是C++处理转换bmp到png的。 我看了libpng (http://www.libpng.org/pub/png/libpng.html) 这个库,但是调试这个环境很麻烦 一直没有弄好,有谁用过? 或者处理过从 BMP到PNG的转换!不用 GDI+!! 给个代码例子最好! 谢谢
...全文
384 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wsjtianyu 2009-02-11
  • 打赏
  • 举报
回复
CxImage类库,一个保存函数就能搞定
VirGhost 2009-02-10
  • 打赏
  • 举报
回复
//lpszPathName是路径字符串(即PNG文件)

FILE *fp = NULL;
char buf[PNG_BYTES_TO_CHECK];

LPSTR lpszFileName = lpszPathName;
if(!lpszFileName) return false;

//打开PNG文件
if(NULL == (fp = fopen(lpszFileName,"rb")))
{
delete []lpszFileName;
lpszFileName = NULL;
return false;
}

//验证是否为PNG文件
if(fread(buf,1,PNG_BYTES_TO_CHECK,fp) != PNG_BYTES_TO_CHECK)
{
fclose(fp);
delete []lpszFileName;
lpszFileName = NULL;
return false;
}

if( 0 != png_sig_cmp((unsigned char*)buf,(png_size_t)0,PNG_BYTES_TO_CHECK))
{
fclose(fp);
delete []lpszFileName;
lpszFileName = NULL;
return false;
}

//以下代码读取PNG文件
png_structp png_ptr = NULL;
png_infop info_ptr = NULL;
unsigned int sig_read = PNG_BYTES_TO_CHECK;
int color_type = 0,interlace_type = 0;

png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL);
if( NULL == png_ptr)
{
fclose(fp);
delete []lpszFileName;
lpszFileName = NULL;
return false;
}

info_ptr = png_create_info_struct(png_ptr);
if(NULL == info_ptr)
{
fclose(fp);
png_destroy_read_struct(&png_ptr,&info_ptr,png_infopp_NULL);
delete []lpszFileName;
lpszFileName = NULL;
return false;
}

png_init_io(png_ptr,fp);
png_set_sig_bytes(png_ptr,sig_read);
png_read_info(png_ptr,info_ptr);

if(info_ptr->bit_depth == 16)png_set_strip_16(png_ptr);
if(info_ptr->color_type == PNG_COLOR_TYPE_GRAY && info_ptr->pixel_depth < 8)
png_set_gray_1_2_4_to_8(png_ptr);
switch (info_ptr->pixel_depth)
{
case 32:
if (info_ptr->color_type & PNG_COLOR_MASK_COLOR)png_set_bgr(png_ptr);
png_set_invert_alpha(png_ptr);
//当为32位图像是应该如何处理,例如
//pDib->CreateDIB(info_ptr->width, info_ptr->height,32);
break;
case 24:
{
png_color_16 my_background={0,255,255,255,0};
png_set_background(png_ptr,&my_background,
PNG_BACKGROUND_GAMMA_SCREEN,0,1.0);
if (info_ptr->color_type & PNG_COLOR_MASK_COLOR)png_set_bgr(png_ptr);
//当为32位图像是应该如何处理,例如
//pDib->CreateDIB(info_ptr->width, info_ptr->height,24);
}
break;
case 8:
case 4:
//当为32位图像是应该如何处理,例如
//if(info_ptr->num_palette>0)
//{
// DWORD *pRQ=new DWORD[info_ptr->num_palette];
// for(int i=0;i<info_ptr->num_palette;i++)
// {
// pRQ[i]=RGB(info_ptr->palette[i].red,info_ptr->palette[i].green,info_ptr->palette[i].blue);
// }
// pDib->CreateDIB(info_ptr->width, info_ptr->height,info_ptr->pixel_depth,pRQ,info_ptr->num_palette);
// delete[] pRQ;
//}
break;
default:
return false;
}

png_bytepp prow_pointers = new png_bytep[info_ptr->height];

UINT nRowBytes = png_get_rowbytes(png_ptr,info_ptr);
UINT row;
for(row=0;row<info_ptr->height;row++)
prow_pointers[row]=new BYTE[nRowBytes];

png_read_image(png_ptr,prow_pointers);
png_read_end(png_ptr,info_ptr);

//拷贝转换后的图像数据,以下是我自己的实现
for(row=0;row<info_ptr->height;row++)
memcpy(pDib->m_lpImage+(info_ptr->height-row-1)*pDib->m_nByteWidth,
prow_pointers[row],pDib->m_nByteWidth);

return TRUE;
jcreatorqijiashe 2009-02-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zooedward 的回复:]
你可以去看看FreeImage这个库。支持的格式很多,而且是开源的。
[/Quote]

这个我看了,库太大。我的问题是自己用c代码应该怎么转换?
zooedward 2009-02-05
  • 打赏
  • 举报
回复
你可以去看看FreeImage这个库。支持的格式很多,而且是开源的。
Soyokaze 2009-02-05
  • 打赏
  • 举报
回复
好像有个这样的库,貌似开源的,楼主可以搜一下,叫pnglib来着。

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧