c语言获取图片属性

faruba 2011-06-26 05:04:24
加精
c语言(linux下)如何提取一个图片的属性,比如:获取文件的长、宽等信息。或者谁能说说图片(bmp,jpg,jpeg,yuv420...)的数据是怎么组织的。linux下据说有一些文件操作库,不知道是那些,提供了那些接口。
...全文
3143 102 打赏 收藏 转发到动态 举报
写回复
用AI写文章
102 条回复
切换为时间正序
请发表友善的回复…
发表回复
秦剑 2011-12-09
  • 打赏
  • 举报
回复
要是想处理的话有OpenCV库可以用。。
是Intel开源的项目 。。
秦剑 2011-12-09
  • 打赏
  • 举报
回复
要么用别人的库,要么自己读文件按照各文件格式判断。
xiangpengmeng 2011-12-03
  • 打赏
  • 举报
回复
这些图片在文件头部都是有头部信息的。
wenyusheng00 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jiaxiongxu 的回复:]
bmp、jpg、gif文件前几位数据都是用来标识文件类型的。例如bmp头两字节一定是“BM”,jpg前两字节是0xFFD8等,可以用这个来识别。然后每种图片的头都有特定偏移量储存图片信息。
[/Quote]


顶了啊。
Aslaabc 2011-10-26
  • 打赏
  • 举报
回复
Linux的水好深啊。。。
ab_cd_ef_g 2011-10-03
  • 打赏
  • 举报
回复
来这儿学习学习。
灼眼的超哥 2011-08-15
  • 打赏
  • 举报
回复
还有mp3,wav,wma这些音频文件,以及mp4,avi等视频文件,也想获取它的信息,什么比特率啊,采样率啊,声道啊,之类的。
灼眼的超哥 2011-08-15
  • 打赏
  • 举报
回复
这是读取png图片信息的:

#include <png.h>
int detect_png(char* file)

{
int tempi;
char buff[100];
fp = fopen(file, "rb");
png_structp png_ptr;
png_infop info_ptr;
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
info_ptr = png_create_info_struct(png_ptr);
setjmp(png_jmpbuf(png_ptr));
// 这句很重要

//检测是否为png图片
fread(buff,1,13,fp);
tempi = png_sig_cmp(buff,(png_size_t)0,13);
if (tempi != 0){//如果不是png图片
fclose(fp);
return 1;
}
rewind(fp);
png_init_io(png_ptr,fp);
// 读文件了
png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND, 0);
// 得到文件的宽、高、位深
image_width = png_get_image_width(png_ptr, info_ptr);
image_hight = png_get_image_height(png_ptr, info_ptr);
image_depth = png_get_bit_depth(png_ptr, info_ptr);
fclose(fp);
return 0;
}


这是读取bmp图片信息的:

typedef struct bmp_head {
//bmp头文件
short int BMPsyg;
short int nic[8];
short int ix;
short int nic2;
short int iy;
short int nic3[2];
short int depth;
short int rle;
short int nic4[11];
} bmp_head;

int detect_bmp(char *file)
//检测bmp图片信息
{
bmp_head bmp;
fp = fopen(file,"r");//打开图片文件
fread(&bmp,1,sizeof(bmp_head),fp);//读取数据
if (bmp.BMPsyg != 19778)
{
fclose(fp);
return 1;
}
image_width = bmp.ix;//图片的宽度
image_hight = bmp.iy;//图片的高度
image_depth = bmp.depth;//图片的位深
fclose(fp);
return 0;
}


另外,同求能获取jpg和gif图片信息的代码。
灼眼的超哥 2011-08-15
  • 打赏
  • 举报
回复
bmp和png文件倒是好获取,但是,现在还没找到gif和jpeg的。

mgaview的源码里有专门识别图片文件的函数。

png可以用libpng库的函数,读取图片的宽和高,以及位深。
  • 打赏
  • 举报
回复
图像文件都有文件头的,文件头里的结构体肯定有图像文件的这些属性的,所以你了解以下各种图片的文件头格式,用C就随便可以读出这些属性的~~
willing198703 2011-07-06
  • 打赏
  • 举报
回复
这个倒网上查查就应该有了的
sfd1234 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jiaxiongxu 的回复:]
bmp、jpg、gif文件前几位数据都是用来标识文件类型的。例如bmp头两字节一定是“BM”,jpg前两字节是0xFFD8等,可以用这个来识别。然后每种图片的头都有特定偏移量储存图片信息。
[/Quote]

非常正确!
stillnight 2011-07-05
  • 打赏
  • 举报
回复
学习学习了,哈哈!!!
MAY 2011-07-05
  • 打赏
  • 举报
回复
所有的媒体文件都可以当普通的文件来处理。
只不过一些压缩算法及格要自己处理而己。
如果只是做开发的话,建议用上面提到的媒体库。
baibozsh 2011-07-05
  • 打赏
  • 举报
回复
下载网页时候,如何保存图片,因为有http头
li_shigang 2011-07-05
  • 打赏
  • 举报
回复
这是以前在哪里找的一段代码,获取图片宽高信息

int ParsePic(BYTE *pHead, int &iWidth, int &iHeight)
{
BYTE n[4];
n[0]=pHead[0];
n[1]=pHead[1];
n[2]=pHead[2];
n[3]=pHead[3];

int i=1;

if(n[0] == 0xFF && n[1] == 0xD8) //jpeg //图片类型0
{
i=iWidth<40000?iWidth-1000:30000;
while(i>20)
{
i--;
if(pHead[i] < 0xC0) continue;
if(pHead[i] > 0xC3) continue;
i--;
if(pHead[i] != 0xFF) continue;
i+=5;
break;
}
if(i<=20) return -1;

iHeight=pHead[i]*256+pHead[i+1];
i+=2;
iWidth=pHead[i]*256+pHead[i+1];
return 0;
}
if(n[0] == 'G' && n[1] == 'I' && n[2] == 'F') //gif //图片类型3
{
iWidth=pHead[7]*256+pHead[6];
iHeight=pHead[9]*256+pHead[8];
return 3;
}

if(n[0] == 'B' && n[1] == 'M') //bmp //图片类型2
{
iWidth=pHead[19]*256+pHead[18];
iHeight=pHead[23]*256+pHead[22];
return 2;
}

if(n[0] == 0x89 && n[1] == 0x50 && n[2] == 0x4E && n[3] == 0x47) //png //图片类型1
{
while(i<iWidth)//length
{
i++;
if(pHead[i] != 0x49) continue;
i++;
if(pHead[i] != 0x48) continue;
i++;
if(pHead[i] != 0x44) continue;
i++;
if(pHead[i] != 0x52) continue;
i++;
if(i > iWidth-10) return -2;
break;
}

iWidth=pHead[i+2]*256+pHead[i+3];
iHeight=pHead[i+6]*256+pHead[i+7];
return 1;
}

return -1;
}
QQ126420 2011-07-05
  • 打赏
  • 举报
回复
你要看是什么图片
jpeg格式应该还读取,linux下有一套关于jpeg开发库,libjpeg,里面封装了好多函数,有的函数应该能获取到属性
bmp图片,因该也好处理,把图片读出来,分析bmp图片结构,至于bmp图片结构网上介绍比较多,可以查阅下
其他格式,不是很了解
sunsea1026 2011-07-04
  • 打赏
  • 举报
回复
你要看是什么图片
jpeg格式应该还读取,linux下有一套关于jpeg开发库,libjpeg,里面封装了好多函数,有的函数应该能获取到属性
bmp图片,因该也好处理,把图片读出来,分析bmp图片结构,至于bmp图片结构网上介绍比较多,可以查阅下
其他格式,不是很了解
jpjiang4648 2011-07-04
  • 打赏
  • 举报
回复
学习了
cbbie 2011-07-04
  • 打赏
  • 举报
回复
看起来不错!!学习!!!
加载更多回复(82)

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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