我有一个带位图的功能,复制它的一部分并将其保存为8bpp tiff。结果图像的文件名是唯一的,文件不存在,程序有权写入目标文件夹。
void CropImage(Bitmap map) {
Bitmap croped = new Bitmap(200, 50);
using (Graphics g = Graphics.FromImage(croped)) {
g.DrawImage(map, new Rectangle(0, 0, 200, 50), ...);
}
var encoderParams = new EncoderParameters(2);
encoderParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, 8L);
encoderParams.Param[1] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionNone);
croped.Save(filename, tiffEncoder, encoderParams);
croped.Dispose();
}
奇怪的是,这个函数在某些计算机上运行良好(Win 7)并抛出System.Runtime.InteropServices.ExternalException:在其他计算机(主要是Win XP)上的GDI异常中发生了一般错误。
所有计算机都安装了.NET 3.5 SP1运行时。
如果我使用croped.Save(filename, ImageFormat.Tiff);
代替croped.Save(filename, tiffEncoder, encoderParams);
而不是它适用于所有计算机,但我需要以8bpp格式保存Tiff。
你有什么想法,问题出在哪里?
谢谢,Lukas
答案 0 :(得分:1)
GDI是一种Windows操作系统功能。我在处理16位TIFF文件时遇到了类似的问题,并使用了不同的库。见using LibTIFF from c#
MSDN帮助建议该功能可用,但是当您尝试将位图复制到新位图或将其保存到文件或流时,Windows会抛出“通用错误”异常。实际上,相同的功能在Windows7上运行良好(它似乎具有良好的TIFF支持)。见New WIC functioanity in Windows 7。
我使用的另一个解决方案是以8位制作不安全的副本。这样我就可以保存PNG文件(带调色板)。我还没试过TIFF。
// part of a function taking a proprietary TIFF tile structure as input and saving it into the desired bitmap format
// tile.buf is a byterarray, containing 16-bit samples from TIFF.
bmp = new Bitmap(_tile_width, _tile_height, PixelFormat.Format8bppIndexed);
System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData bmpData =bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,bmp.PixelFormat);
int bytes = bmpData.Stride * bmp.Height;
dstBitsPalette = (byte *)bmpData.Scan0;
offset=0;
for (offset = 0; offset < _tile_size; offset += 2)
{
dstBitsPalette[offset >> 1] = tile.buf[offset + 1];
}
// setup grayscale palette
ColorPalette palette = bmp.Palette;
for (int i = 0; i < 256; i++)
{
Color c = Color.FromArgb(i, i, i);
palette.Entries[i] = c;
}
bmp.Palette = palette;
bmp.UnlockBits(bmpData);
return bmp;
}