2009-06-15 55 views
1

我有一個ushort像素數據(16位灰度值)數組,我試圖將它保存爲jpeg圖像。但是,我的代碼在「保存」命令中出現「GDI +中發生的一般錯誤」。我無法弄清楚如何解決這個問題。我保存的目錄是由我的應用程序創建的,我向其寫入了其他文件;所以我知道這不是一個權限問題。這可能是數據損壞問題嗎?我在做什麼錯誤的步驟中獲取ushort數據到Bitmap對象?因爲我有ushort數據我發現它花了一些努力來弄清楚如何將它放入Bitmap對象,並且我可能做錯了。當將位圖對象保存爲jpeg時,出現了「GDI +中發生的一般錯誤」#:

這裏是我的代碼:

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); 

這整個事情已經變得非常沮喪。請幫忙?!

+0

你是在單獨的線程中運行它嗎? – jjxtra 2009-06-15 19:37:18

+0

是的,我在一個單獨的線程中運行它。你認爲這是問題嗎? – 2009-06-15 20:21:49

回答

3

我很害怕它與灰度/ JPG有關。我不知道JPEG是否支持灰度。

我會嘗試聲明位圖爲正常的顏色之一。並測試。

+0

這似乎是問題所在。當我將PixelFormat更改爲某種顏色格式時,它不會崩潰。但是,生成的jpeg圖像顏色不詳細,細節丟失。 – 2009-06-15 20:40:50

0

我敢打賭,這是權限問題。 GDI +是本地組件,我相信它需要不同於普通文件保存的權限或類似的東西。這是ASP.NET應用程序嗎?如果是這樣,請確保您爲該文件夾的IIS進程授予權限。

0

我見過這種情況發生時,我保存的維度是無效的。寬度爲0.

1

我發現任何我已經繪製的位圖,無論是哪種方式,偶爾都會被保存爲JPEG格式(除了您所看到的例外)。什麼幫助是第一克隆圖像:

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

也許通過這樣做,你也可以嘗試更改像素格式,因爲我也認爲,就像tekBlues,有可能與灰度的問題。

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); 
1

不幸的是,GDI +不支持PixelFormat.Format16bppGrayScale正常。我一直在研究這個長期存在的問題,並沒有找到解決方案。

看來,現代的做法是使用System.Windows.Media中較新的WPF API。

相關問題