情况:我有一个文件,其中包含文本数据和许多二进制 TIFF 图像。我需要更改一些 tiff 属性标签,因为在将它们放入该文件之前最初创建 tiff 时,它们的配置错误。因此,我将二进制数据转储到 byte[],然后转储到 MemoryStream,然后转储到 Image,然后继续从 Image.PropertyItems 中删除所有 PropertyItems,然后通过 Image.SetPropertyItem() 重新创建我自己的标签。最后,我使用正确的编码器信息和编码器参数执行 Image.Save()。
问题:创建的文件不包含我创建的所有属性项,并且我更改的某些项已被完全忽略。属性项中的数据类型也已被忽略(短已更改为长等)。这就像 Image.Save() 重写它想要的任何东西。更具体地说,我将 ImageWith 和 ImageLength 属性指定为 SHORT,并将它们写为 LONG。而且 PlanarConfig 属性项甚至根本没有被写入。
这是我的一些代码:(知道为什么会发生这种情况以及如何解决吗?)
const int SHORT = 3;
const int SHORT_LEN = 2;
const int LONG = 4;
const int LONG_LEN = 4;
const int RATIONAL = 5;
const int RATIONAL_LEN = 8;
byte[] bytesFront = bco.Records[0].Fields[4].Data;
byte[] bytesRear = bco.Records[0].Fields[6].Data;
MemoryStream msFront = new MemoryStream(bytesFront);
Bitmap imgFront = (Bitmap)Image.FromStream(msFront);
PropertyItem pi = imgFront.GetPropertyItem(imgFront.PropertyIdList.First<int>());
foreach (PropertyItem currentPropertyItem in imgFront.PropertyItems)
{
imgFront.RemovePropertyItem(currentPropertyItem.Id);
}
// SubFile Type
pi.Id = 254;
pi.Type = LONG;
pi.Len = LONG_LEN;
pi.Value = GetBytes((uint)0);
imgFront.SetPropertyItem(pi);
// Image Width
pi.Id = 256;
pi.Type = SHORT;
pi.Len = SHORT_LEN;
pi.Value = GetBytes((ushort)imgFront.Width);
imgFront.SetPropertyItem(pi);
//...
// Planar Config
pi.Id = 284;
pi.Type = SHORT;
pi.Len = SHORT_LEN;
pi.Value = GetBytes((ushort)1);
imgFront.SetPropertyItem(pi);
// Resolution Unit
pi.Id = 296;
pi.Type = SHORT;
pi.Len = SHORT_LEN;
pi.Value = GetBytes((ushort)2);
imgFront.SetPropertyItem(pi);
ImageCodecInfo encoderInfo = ImageCodecInfo.GetImageEncoders().First(i => i.MimeType == "image/tiff");
EncoderParameters encoderParameters = new EncoderParameters(1);
encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionCCITT4);
imgFront.Save(@"C:\Temp\imgFront.tif", encoderInfo, encoderParameters);