如何得到一个jpg文件的长和宽

qiyousyc 2006-05-21 12:15:47
如何得到一个jpg文件的长和宽
...全文
179 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Snow_Ice11111 2006-05-22
  • 打赏
  • 举报
回复
To ok1234567(ok1234567)朋友:
  直接读取jpg文件中关于图片信息的方法很不错,上述代码在测试工程中也可得到正确图片大小的信息。想知道你所说的“这个解析还有极少数图片的高宽解析不正确(非常少)”,在什么场合会不正确?我开了个帖子:
http://community.csdn.net/Expert/topic/4769/4769390.xml?temp=.1704065
敬请光临!
ok1234567 2006-05-21
  • 打赏
  • 举报
回复
jpg文件的定义很复杂
我上面提供的函数可以不用创建图片对象
将文件数据读到pHead中,解析就可以了
IPicture接口也不错,但是有许多Jpg文件解析不出来,速度也很慢
用jpeg官方提供的库函数,是正解

//----------
BYTE *pHead;

CFile f;
f.Open("c:\\aaa.jpg",CFile::modeRead);
int iWidth=f.GetLength();
pHead=new BYTE[iWidth];
f.Read(pHead,iWidth);
f.Close();
int iHeight;
ParsePic(pHead,iWidth,iHeight);
//----------------
此时,iWidth,iHeight就是图片的size

qiyousyc 2006-05-21
  • 打赏
  • 举报
回复
我是菜鸟,那位大哥给个完整的代码。
ok1234567(ok1234567) 的代码缺少东西

我说明个例,文件c:\aaa.jpg,得到此文件的宽高(就是此文件摘要中的那个值)
DentistryDoctor 2006-05-21
  • 打赏
  • 举报
回复
借助于IPicture/GDI+
Snow_Ice11111 2006-05-21
  • 打赏
  • 举报
回复
先把文件内容读入一个IPictrue对象中,再:
IPicture::get_Width
IPicture::get_Height
ok1234567 2006-05-21
  • 打赏
  • 举报
回复
这是我的研究,注:iWidth传送jpg数据(pHead)的大小
pHead为jpg数据指针
这个解析还有极少数图片的高宽解析不正确(非常少)
当然,如果利用jpeg的标准类库,那是没有问题的,我在使用中,重要的是性能,不想创建图片对象

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
{
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;
/*
if(n[3] == 0xE1)
{
while(i<iWidth)//length
{
i++;
if(pHead[i] != 0xFF) continue;
i++;
if(pHead[i] != 0xC0) continue;
i+=4;
if(i > iWidth-10) return -2;
break;
}
if(i>=iWidth) return -1;
}
else
{
i=iWidth-100;
while(i>10)
{
i--;
if(pHead[i] != 0xC0 && pHead[i] != 0xC2) continue;
i--;
if(pHead[i] != 0xFF) continue;
i+=5;
break;
}
if(i<=10) return -1;
}
*/

iHeight=pHead[i]*256+pHead[i+1];
i+=2;
iWidth=pHead[i]*256+pHead[i+1];
return 0;
}
return 0;
}

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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