2

我有一组 ushort 像素数据(16 位灰度值),我正在尝试将其保存为 jpeg 图像。但是,我的代码在“GDI+ 中发生一般错误”的保存命令中崩溃。我不知道如何解决这个问题。我要保存到的目录是由我的应用程序创建的,我将其他文件写入其中;所以我知道这不是权限问题。这可能是数据损坏问题吗?我在将 ushort 数据放入 Bitmap 对象的步骤中做错了吗?因为我有ushort数据,所以我发现要弄清楚如何将其放入 Bitmap 对象需要付出一些努力,而且我可能做错了。

这是我的代码:

Bitmap img = new Bitmap(width, height, PixelFormat.Format16bppGrayScale);
Rectangle rect = new Rectangle(0,0, width, height);
BitmapData picData = img.LockBits(rect, ImageLockMode.ReadWrite, img.PixelFormat);
IntPtr pixelStartAddress = picData.Scan0;

WriteableBitmap pic = new WriteableBitmap(width, height, 96.0, 96.0, System.Windows.Media.PixelFormats.Gray16, null);

int stride = (thumb.XSize * pic.Format.BitsPerPixel + 7) / 8;
pic.WritePixels(new System.Windows.Int32Rect(0, 0, width, height), dataArray, stride, 0);  

pic.CopyPixels(new System.Windows.Int32Rect(0,0,thumb.XSize, thumb.YSize),pixelStartAddress, dataArray.Length * sizeof(ushort), stride);

img.UnlockBits(picData);
img.Save(path, ImageFormat.Jpeg);

这整件事变得非常令人沮丧。请帮忙?!

4

6 回答 6

3

我担心它与灰度/ JPG有关。我不知道JPEG是否支持灰度。

我会尝试将位图声明为普通颜色。和测试。

于 2009-06-15T19:45:34.200 回答
1

我发现我绘制的任何位图,无论采用哪种方式,在保存为 JPEG 时偶尔都会出现问题(您看到的例外情况除外)。有帮助的是首先克隆图像:

img.Clone(); // or:
img.Clone(rectangle, img.PixelFormat);

也许通过这样做,您也可以尝试更改像素格式,因为我也假设,就像 tekBlues 一样,灰度可能存在问题。

于 2009-06-15T19:53:40.813 回答
1

关于您对图像质量的评论(我会作为评论回复,但它会丢失代码格式):

您正在使用 JPEG 导出的默认设置进行保存。您可以使用更高质量设置创建自己的 EncoderParameters 实例:

var encParams = new EncoderParameters(1);
var encParams.Param[0] = new EncoderParameter(Encoder.Quality, 91L);
// get jpegEncoder by looping through ImageCodecInfo.GetImageEncoders())
image.Save("path to file", jpegEncoder, encParams); 
于 2009-06-15T23:03:33.567 回答
1

不幸的是,GDI+ 不能PixelFormat.Format16bppGrayScale正确支持。我一直在研究这个长期存在的问题,但没有找到解决方案。

似乎现代方法是在System.Windows.Media.

于 2012-10-17T11:49:52.420 回答
0

我敢打赌这是权限问题。GDI+ 是本机组件,我相信它需要不同于常规文件保存或类似的权限。这是 ASP.NET 应用程序吗?如果是这样,请确保您授予该文件夹的 IIS 进程权限。

于 2009-06-15T19:28:53.673 回答
0

当我保存的尺寸无效时,我已经看到这种情况发生。比如宽度为 0。

于 2009-06-15T19:33:46.283 回答