【发布时间】:2014-07-31 19:35:30
【问题描述】:
有很多示例如何使用 Bitmap 类枚举和编辑 EXIF 标签。
这是一个:
Bitmap bJpgWithExifData = (Bitmap)Image.FromFile(@"myfile.jpg");
foreach (var item in bJpgWithExifData.PropertyItems)
{
Console.WriteLine( "{0}\t{1}\t{2}",item.Type,item.Id,item.Len);
}
但是,这并不能解释我如何获取这些标签的字符串值。数据是二进制的,当我尝试使用 Encoding.ASCII.GetString(item.Value) 对其进行解码时,我得到了一些垃圾而不是正确的属性。
如何获取字符串值?
更新
JPEGSnoop 显示的 exif 标签如下:
EXIF IFD0 @ Absolute 0x00000014
Dir Length = 0x0010
[Model ] = "GT-I9500"
[Orientation ] = Row 0: top, Col 0: left
[WhiteBalance ] = Auto white balance
[DateTime ] = "2014:07:30 13:24:28"
[Make ] = "SAMSUNG"
[ExifOffset ] = @ 0x010C
Offset to Next IFD = 0x00000000
在枚举 c# 属性时,我看到 18 个不同的属性,其中 2 个是类型 2(“2014:07:30 13:24:28”和“SAMSUNG”转换为字符串)
我如何获得其余的值?
更新 1
这是我用来打印值的代码:
foreach (var item in bJpgWithExifData.PropertyItems)
{
Console.WriteLine("{0}\t0x{1}\t{2}\t{3}\t{4}",item.Type,item.Id.ToString("x"),item.Len,Convert.ToBase64String(item.Value),Encoding.ASCII.GetString(item.Value));
}
这是输出:
3 0x100 2 IBA= >
3 0x101 2 Egk= ¦
2 0x10f 8 U0FNU1VORwA= SAMSUNG
3 0x112 2 AQA= O
2 0x132 20 MjAxNDowNzozMCAxMzoyNDoyOAA= 2014:07:30 13:24:28
10 0x829a 8 PgAAAOgDAAA= > ?¦
10 0x829d 8 FgAAAAoAAAA= -
4 0x201 4 KgEAAA== *O
4 0x202 4 AAAAAA==
3 0x8822 2 AgA= O
3 0x8827 2 MgA= 2
3 0x9207 2 AgA= O
3 0x9208 2 AAA=
3 0x9209 2 AQA= O
5 0x920a 8 pAEAAGQAAAA= ?O d
3 0xa403 2 AAA=
3 0x5091 128 BwAHAAoAEwAoACgAKAAoAAcACAAKABoAKAAoACgAKAAKAAoAFgAoACgAKAAoACgAEwAaACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAA=
! ( ( ( (
> ( ( ( (
- ( ( ( ( ( ! > ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (
3 0x5090 128 BgAEAAQABgAKABAAFAAYAAUABQAGAAgACgAXABgAFgAGAAUABgAKABAAFwAcABYABgAHAAkADAAUACMAIAAZAAcACQAPABYAGwAsACkAHwAKAA4AFgAaACAAKgAtACUAFAAaAB8AIwApADAAMAAoAB0AJQAmACcALQAoACkAKAA= ¦ ¦ ¦ ¦
> ¶ ^ ¦ ¦
¦ ^ - ¦ ¦ ¦
> ¦ L - ¦ + ¶ # v 0 - < , ) Ў
d - > * - % ¶ > Ў # ) 0 0 ( - % & ' - ( ) (
【问题讨论】:
-
Type==2 是您尝试使用 ASCII.GetString 的地方吗?
-
正如@rene 上面提到的,在使用 ASCII 编码器之前,请确保属性的类型(PropertyItem.Type)等于 2。这表示该属性值是使用 ASCII 编码器编码的。有关不同类型的详细信息,请参阅msdn.microsoft.com/en-us/library/…
-
如果您向我们展示了“垃圾”的示例,那么我们可能会看到一些东西,但可能是(某些)EXIF 字符串是 UTF-8 编码的:请参阅“A解决方案?”在A Chinese puzzle: Unicode and EXIF metadata parsing。 JPEGSnoop 可能会这样做。
-
@JawwadAlam 在属性列表中,我只有 2 个类型为 (2) 的属性。 JPEGSnoop 怎么能看到 3 个该类型的属性?