我们遇到了一些6型OJPEG压缩的TIFF图像,很多都有相同的BitsPerSample“8 8 8”并且工作正常。
但是,我们现在看到的BitsPerSample值为“8 25608 0”。我想知道这是否可能,如果不是,它是否是系统中产生TIFF的错误。如果可能,只需修改标签就可以修复它们,这样BitsPerSample就是“8 8 8”?
目前我只找到一个可以通过将它们转换为未压缩的TIFF来处理它们的工具(LEAD),显然我不知道它是如何做到这一点的,只是为了解决一个极少数的问题,这是一个很大的开销图像。
有没有人遇到这个或者比我更了解这个问题是否简单或复杂,到目前为止,我在Libtiff.net代码中探索的尝试并不是很有成效!
干杯
更新:使用litiff.net这样简单:
static void Main(string[] args)
{
using (Tiff image = Tiff.Open(args[0], "r"))
{
FieldValue[] value = image.GetField(TiffTag.IMAGEWIDTH);
int width = value[0].ToInt();
Console.WriteLine(string.Format("Width = {0}", width));
}
}
结果(显然跳过了异常处理!):
ReadDirectory:警告,10.TIF:遇到标记为33000(0x80e8)的未知字段 10.TIF:无法处理字段“BitsPerSample”
的不同每个样本值未处理的异常:System.NullReferenceException:未将对象引用设置为对象的实例。 at tifftest.Program.Main(String [] args)在C:\ tiffstuff \ tifftest \ tifftest \ Program.cs:第15行 分段错误
我现在让它绕过检查并假设8为“BitsPerSample”但是我现在尝试使用bitmiracle网站上的示例提取图像以保存为BMP:
using (Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb))
{
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData bmpdata = bmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
byte[] bits = new byte[bmpdata.Stride * bmpdata.Height];
for (int y = 0; y < bmp.Height; y++)
{
int rasterOffset = y * bmp.Width;
int bitsOffset = (bmp.Height - y - 1) * bmpdata.Stride;
for (int x = 0; x < bmp.Width; x++)
{
int rgba = raster[rasterOffset++];
bits[bitsOffset++] = (byte)((rgba >> 16) & 0xff);
bits[bitsOffset++] = (byte)((rgba >> 8) & 0xff);
bits[bitsOffset++] = (byte)(rgba & 0xff);
}
}
System.Runtime.InteropServices.Marshal.Copy(bits, 0, bmpdata.Scan0, bits.Length);
bmp.UnlockBits(bmpdata);
bmp.Save("c:\\tiffstuff\\TiffTo24BitBitmap.bmp");
}
我显然得到了OJPEG警告,然后是以下内容: OJPEGReadHeaderInfoSecTablesQTable:缺少JPEG表
结果图像只有100%绿色。
在解决这个问题方面,我是否离我太深了?我知道JPEG在某处似乎无法获得它并成功解压缩它: - (
答案 0 :(得分:1)
有点深度25608绝对是错误的。 JPEG压缩从不使用每像素8位以外的位深度。还有其他图像格式可以使用每像素16位甚至32位,但这与任何正常应用程序一样高。
在JPEG中,存在RGB图像,即“8 8 8”,CMYK图像,即“8 8 8 8”,以及单色图像,即。 “8”。
图像可能是CMYK,而您使用的软件不支持该图像。在这种情况下,您需要将它们转换为RGB以将其与该软件一起使用。
如果图像是RGB,则标签只是损坏,修复它会使图像正常工作。 (当然假设没有其他东西也被破坏了。)
答案 1 :(得分:1)
好像文件是半破碎的。正如@Guffa所提到的,对于OJPEG文件,每个样本值的位数应为8 8 8
(RGB)或8 8 8 8
(CMYK)
不幸的是,LibTiff.Net没有机会修复像BITSPERSAMPLE
这样的重要标签。
我看到的唯一选择是将此类文件的自动更正代码添加到库中。
提供错误的代码位于Tiff_DirRead.cs
文件中(在下面显示的三个位置)。
private bool fetchPerSampleShorts(TiffDirEntry dir, out short pl)
{
...
for (ushort i = 1; i < check_count; i++)
{
if (v[i] != v[0])
{
ErrorExt(this, m_clientdata, m_name,
"Cannot handle different per-sample values for field \"{0}\"",
FieldWithTag(dir.tdir_tag).Name);
failed = true;
break;
}
}
...
}
private bool fetchPerSampleLongs(TiffDirEntry dir, out int pl)
{
...
for (ushort i = 1; i < check_count; i++)
{
if (v[i] != v[0])
{
ErrorExt(this, m_clientdata, m_name,
"Cannot handle different per-sample values for field \"{0}\"",
FieldWithTag(dir.tdir_tag).Name);
failed = true;
break;
}
}
...
}
private bool fetchPerSampleAnys(TiffDirEntry dir, out double pl)
{
...
for (ushort i = 1; i < check_count; i++)
{
if (v[i] != v[0])
{
ErrorExt(this, m_clientdata, m_name,
"Cannot handle different per-sample values for field \"{0}\"",
FieldWithTag(dir.tdir_tag).Name);
failed = true;
break;
}
}
...
}
您可能会尝试删除if (v[i] != v[0])
子句和相应的错误处理代码。我想这会让你打开文件(如果没有其他问题)。
您可能希望以某种方式转换或至少修补此类文件。