c++如何打开jpg图像
我看了CharlesPetzold的programmingwindows第五版,上面详细介绍了各种有关.bmp文件的操作,可是现在我需要处理.jpg和.tiff文件,请问...
我看了Charles Petzold 的 programming windows 第五版,上面详细介绍了各种有关.bmp文件的操作,可是现在我需要处理 .jpg 和.tiff 文件,请问如何读入,显示这些文件?(我的编译环境visual c++ 6.0) ps: 如果用fopen打开文件,如何得到图像的RGB值? 谢谢大家了!回答的详细一些,急用,小弟谢谢了!
展开
2013-09-02
展开全部
你的问题的主要困难在于解压缩。 .tiff格式与.bmp相似,通常都没有压缩或者只有简单的RLE压缩。但.jpg与此不同,它通常采用四道压缩工序,压缩算法很复杂,里面涉及很多数学(从jpeg的英文名字“联合图像专家组”就可以感受到),所以解压缩的过程是很繁琐的。另外windows内建对jpeg格式的支持,因此通常没有人会自己写这些解压缩算法,又费力又容易出错,效率还不如微软的算法。用Windows SDK中的IPicture可以读取jpeg文件并直接得到图像的RGB值,你需要去MSDN查一下相关的文件。 如果你对自己的数学基础有信心,而且一定想要知道jpeg的压缩/解压缩原理,那么下面这篇水母的文章可能对你有用(反正我看了几句就看不懂了): 水木社区(展开完整界面) → 数字多媒体应用 → 精华区文章阅读 DigiMedia 版 (精华区) 6.3 JPEG格式 6.3.1 简介 微处理机中的存放顺序有正序(big endian)和逆序(little endian)之分。正序存放就是 高字节存放在前低字节在后,而逆序存放就是低字节在前高字节在后。例如,十六进制 数为A02B,正序存放就是A02B,逆序存放就是2BA0。摩托罗拉(Motorola)公司的微处理 器使用正序存放,而英特尔(Intel)公司的微处理器使用逆序。JPEG文件中的字节是按照 正序排列的。 ---------------------------------------------------------------------------- ---- JPEG委员会在制定JPEG标准时,定义了许多标记(marker)用来区分和识别图像数据及其 相关信息,但笔者没有找到JPEG委员会对JPEG文件交换格式的明确定义。直到1998年12 月从分析网上具体的JPG图像来看,使用比较广泛的还是JPEG文件交换格式(JPEG File Interchange Format,JFIF)版本号为1.02。这是1992年9月由在C-Cube Microsystems公 司工作的Eric Hamilton提出的。此外还有TIFF JPEG等格式,但由于这种格式比较复杂 ,因此大多数应用程序都支持JFIF文件交换格式。 JPEG文件使用的颜色空间是CCIR 601推荐标准进行的彩色空间(参看第7章)。在这个彩色 空间中,每个分量、每个像素的电平规定为255级,用8位代码表示。从RGB转换成YCbCr 空间时,使用下面的精确的转换关系: Y = 256 * E'y Cb = 256 * [E'Cb] + 128 Cr = 256 * [E'Cr] + 128 其中亮度电平E'y和色差电平E'Cb和E'Cb分别是CCIR 601定义的参数。由于E'y的范围是 0~1,E'Cb和E'Cb的范围是-0.5~+0.5,因此Y, Cb和Cr的最大值必须要箝到255。于是 RGB和YCbCr之间的转换关系需要按照下面的方法计算。 (1) 从RGB转换成YCbCr YCbCr(256级)分量可直接从用8位表示的RGB分量计算得到: Y = 0.299 R + 0.587 G + 0.114 B Cb = - 0.1687R - 0.3313G + 0.5 B + 128 Cr = 0.5 R - 0.4187G - 0.0813 B + 128 需要注意的是不是所有图像文件格式都按照R0,G0,B0,…… Rn,Gn,Bn的次序存储样 本数据,因此在RGB文件转换成JFIF文件时需要首先验证RGB的次序。 (2) 从YCbCr转换成RGB RGB分量可直接从YCbCr(256级)分量计算得到: R = Y + 1.402 (Cr-128) G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128) B = Y + 1.772 (Cb-128) 在JFIF文件格式中,图像样本的存放顺序是从左到右和从上到下。这就是说JFIF文件中 的第一个图像样本是图像左上角的样本。 6.3.2 文件结构 JFIF文件格式直接使用JPE
展开全部
1.图片也是属于文件类型的一种,图片属于二进制文件。使用fopen函数的二进制模式“rb”就可以打开。
2.例程:
#include <stdlib.h>
#include <stdio.h>
int main ()
{
FILE * fpPhoto, * fpText, * fpTarget ;
int iRead ;
char szBuf[100] ;
printf ("请输入第一个文件名(jpg):\n") ;
gets (szBuf) ;
fpPhoto = fopen (szBuf, "rb") ;
printf ("请输入第二个文件名(txt):\n") ;
gets (szBuf) ;
fpText = fopen (szBuf, "rb") ;
printf ("请输入目的文件名(jpg):\n") ;
gets (szBuf) ;
fpTarget = fopen (szBuf, "wb") ;
if (!fpPhoto || !fpText || !fpTarget)
{
printf ("打开文件失败!\n") ;
system("pause") ;
return -1 ;
}
while ((iRead = fread (szBuf, 1, sizeof (szBuf), fpPhoto)) > 0)
fwrite (szBuf, 1, iRead, fpTarget) ;
while ((iRead = fread (szBuf, 1, sizeof (szBuf), fpText)) > 0)
fwrite (szBuf, 1, iRead, fpTarget) ;
fclose (fpPhoto) ;
fclose (fpText) ;
fclose (fpTarget) ;
return 0 ;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询