Chinaunix首页 | 论坛 | 博客
  • 博客访问: 241318
  • 博文数量: 76
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 440
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-20 14:21
文章分类

全部博文(76)

文章存档

2015年(76)

我的朋友

分类: Windows平台

2015-03-05 14:17:45

1. JPEG图片格式的发展历程和简单介绍可参考下面的文章

http://blog.csdn.net/kickxxx/article/details/8173332

2. 读取JPEG图片文件头信息的工具

从上文中可以知道JPEG有两种格式即JFIF和EXIF,现在数码相机为了添加一些附加信息如相机厂家,相机型号等信息多采用EXIF格式的,而需要时实传输数据的相机则多采用节省字节的JFIF格式。目前也有很工具可以辅助我们来读取JFIF 和 EXIF中的附加信息。下面介绍几个小工具。

1)JHEAD

基于DOS命令行的一款软件,可以读取JPEG图片中的JFIF和EXIF信息,可以修改EXIF信息,注意不能修改该图片的EXIF中没有的标签项,也不能修改JFIF中的信息。最大的优点是可以批量处理。使用时注意将JHEAD.EXE与图片放在同一路径下。具体命令格式参考下面这篇博文。

http://blog.csdn.net/geekcome/article/details/6385142

2)EXIV2

EXIV2同样是基于命令行的用来修改图像元信息(meta information)的软件,是用C++开发的。详细介绍和使用方法可参考官网。

3)EXIFTOOL BY PHIL HARVEY

同样是基于命令行的应用程序,但是是基于Perl语言的,可以读、写和编辑更多类型文件的元信息(meta information),甚至可以在EXIF中添加自定义的tag. 因本人没有尝试所以不能确定具体如何操作。详细介绍与使用可参考


3 EXIF格式

由于现在EXIF格式用得比较多,所以重点看一下EXIF的格式,具体参考,该网站上列出的EXIF的标签(tags)非常的全,并且有类型和描述,对于读取和修改EXIF的信息非常的有用。


4 编程实现EXIF信息的读取、修改和添加

在C#语言环境中对于图像元数据的读取和修改可通过GDI和WPF中的图像处理类库实现。

1)读取和修改

a)利用c# GDI+ 实现。

GDI和GDI+是微软的图形设备接口,具体的介绍可查询MSDN网站。在C# 中用GDI+实现对EXIF数据的读取和修改代码可参考下面这篇文章。

下面是本人参考网上资料所写代码。

修改或添加Exif中的tag的信息:

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. Image image = Image.FromFile(@"d:\1.jpg");  
  2. string comments = textEdit_writeInfo.Text;  
  3. PropertyItem pi = image.PropertyItems[0];  
  4. pi.Id = 37510;//想要修改的tag的id,如果该id没有定义则添加一个新的tag  
  5. pi.Type = 7;  
  6. pi.Value = Encoding.GetEncoding("ascii").GetBytes(comments);//将字符串转成字节数组  
  7. pi.Len = pi.Value.Length;  
  8. image.SetPropertyItem(pi);  
  9.   
  10. image.Save(@"d:\temp.jpg");  
  11. image.Dispose();  


读取Exif中某一tag的信息:


[csharp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. Image image = Image.FromFile(@"d:\temp.jpg");  
  2.   
  3. PropertyItem pi = image.GetPropertyItem(37510);  
  4. getinfo = Encoding.GetEncoding("ascii").GetString(pi.Value);  
  5. image.Dispose();  



b)借用WPF图像处理组件。

WPF是微软开发的图像处理组件,通过WPF可以显示、转换图像和设置图像的格式,具体介绍参考MSDN网站.

读取和修改EXIF信息的代码可参考下面的文章:

本方法基本思想是通过读取bitmap图像的基本信息来获得所需要的头信息,以及通过写入bitmap的基本信息来修改相应的图片头信息,中间要涉及到位图的编码和解码问题,所以耗时比较多。

代码如下:

读取:


[csharp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public string extractComment(string imageFilePath)  
  2.         {  
  3.             string getinfo = "";  
  4.             string jpegDirectory = Path.GetDirectoryName(imageFilePath);  
  5.             string jpegFileName = Path.GetFileNameWithoutExtension(imageFilePath);  
  6.   
  7.             BitmapDecoder decoder = null;  
  8.             BitmapFrame bitmapFrame = null;  
  9.             BitmapMetadata metadata = null;  
  10.             FileInfo originalImage = new FileInfo(imageFilePath);  
  11.   
  12.             if (File.Exists(imageFilePath))  
  13.             {  
  14.                 // load the jpg file with a JpegBitmapDecoder      
  15.                 using (Stream jpegStreamIn = File.Open(imageFilePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None))  
  16.                 {  
  17.                     decoder = new JpegBitmapDecoder(jpegStreamIn, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);  
  18.                 }  
  19.   
  20.                 bitmapFrame = decoder.Frames[0];  
  21.                 metadata = (BitmapMetadata)bitmapFrame.Metadata;  
  22.   
  23.                 if (bitmapFrame != null)  
  24.                 {  
  25.                     BitmapMetadata metaData = (BitmapMetadata)bitmapFrame.Metadata.Clone();  
  26.   
  27.                     if (metaData != null)  
  28.                     {  
  29.                         // read the metadata     
  30.                         byte[] info = Encoding.Default.GetBytes(metadata.GetQuery("/app1/ifd/exif:{uint=37510}").ToString());  
  31.                         getinfo = Encoding.GetEncoding("ascii").GetString(info);// getinfo = Encoding.ASCII.GetString(info);  
  32.                     }  
  33.                 }  
  34.             }  
  35.             return getinfo;  
  36.         }  


修改或添加:


[csharp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public void addImageComment(string imageFlePath, string comments)  
  2.       {  
  3.           string jpegDirectory = Path.GetDirectoryName(imageFlePath);  
  4.           string jpegFileName = Path.GetFileNameWithoutExtension(imageFlePath);  
  5.   
  6.           BitmapDecoder decoder = null;  
  7.           BitmapFrame bitmapFrame = null;  
  8.           BitmapMetadata metadata = null;  
  9.           if (File.Exists(imageFlePath))  
  10.           {  
  11.               // load the jpg file with a JpegBitmapDecoder      
  12.               using (Stream jpegStreamIn = File.Open(imageFlePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None))  
  13.               {  
  14.                   decoder = new JpegBitmapDecoder(jpegStreamIn, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);  
  15.               }  
  16.   
  17.               bitmapFrame = decoder.Frames[0];  
  18.               metadata = (BitmapMetadata)bitmapFrame.Metadata;  
  19.   
  20.               if (bitmapFrame != null)  
  21.               {  
  22.                   BitmapMetadata metaData = (BitmapMetadata)bitmapFrame.Metadata.Clone();  
  23.   
  24.                   if (metaData != null)  
  25.                   {  
  26.                       // modify the metadata     
  27.                     metaData.SetQuery("/app1/ifd/exif:{uint=37510}", comments);//comment  
  28.   
  29.                       // get an encoder to create a new jpg file with the new metadata.        
  30.                       JpegBitmapEncoder encoder = new JpegBitmapEncoder();  
  31.                       encoder.Frames.Add(BitmapFrame.Create(bitmapFrame, bitmapFrame.Thumbnail, metaData, bitmapFrame.ColorContexts));  
  32.   
  33.                       // Save the new image   
  34.                       using (Stream jpegStreamOut = File.Open(imageFlePath, FileMode.Create, FileAccess.ReadWrite))  
  35.                       {  
  36.                           encoder.Save(jpegStreamOut);  
  37.                       }  
  38.                   }  
  39.               }  
  40.           }  
  41.       }  



2) 编程实现EXIF中Tag的添加

http://stackoverflow.com/questions/10833928/custom-exif-tags

没有找到很好的方法,本人采取将自定义数据写到User Comment标签中。

后来看到下面的方法,不过还没有尝试,不知道可不可行。

5 相关博文推荐

codeproject上看到的比较好的文章

stack overflow 上的一问答 ,回答里面推荐了codeproject上几篇比较好的文章,值得仔细阅读。

阅读(4387) | 评论(0) | 转发(0) |
0

上一篇:Linux网络编程

下一篇:Python教程

给主人留下些什么吧!~~