2009-06-15 14 views
1

のように保存すると、「GDI +で一般的なエラーが発生しました」というエラーが発生しました。これは、ピクセルピクセルデータ(16ビットのグレースケール値)の配列を持ち、jpegイメージとして保存しようとしています。しかし、私のコードは、 "一般的なエラーがGDI +で発生しました"の保存コマンドでクラッシュしています。私はこれを修正する方法を理解できません。私が保存しているディレクトリは私のアプリケーションで作成され、他のファイルもそこに書き込まれます。だから私はそれが許可の問題ではないことを知っている。データの破損の問題でしょうか? Bitmapオブジェクトにushortデータを取得するための手順が間違っていますか?私はushortのデータを持っているので、それをBitmapオブジェクトに取り込む方法を理解するのに多少の努力が必要だとわかりました。ここでBitmapオブジェクトをjpeg、C#

は私のコードです:

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

+0

ええ、私は別のスレッドでこれを実行します。それが問題だと思いますか? –

答えて

3

私は、それがグレースケール/ JPGと関係があると恐れています。 JPEGがグレースケールをサポートしているかどうかはわかりません。

ビットマップを通常の色として宣言しようとします。そしてテストする。

+0

それは問題のようです。 PixelFormatを何らかのカラーフォーマットに変更するとクラッシュしません。しかし、結果として得られるJPEG画像はカラーではなく、ディテールは失われます。 –

+0

私は "is not color"ではない "not"であることを意味しました –

+2

Jpegは8ビットグレースケールをサポートしています。 – Brian

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

16ビットのグレースケール値が別のものとして使用されているため、品質が失われます。 16ビットは1つの値ではなく3つの値として使用されます。 –

1

残念ながら、GDI +が正しくPixelFormat.Format16bppGrayScaleをサポートしていません。私はこの長年の問題を研究しており、解決策を見出していません。

現代のアプローチは、新しいWPF APIをSystem.Windows.Mediaに使用することです。

関連する問題