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

PixelFormat.Format16bppGrayScale残念ながら、GDI+ は適切にサポートされていません。私はこの長年の問題を調査してきましたが、解決策は見つかりませんでした。

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

于 2012-10-17T11:49:52.420 に答える
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 に答える
0

保存していたディメンションが有効でない場合に、これが発生するのを確認しました。幅0のように。

于 2009-06-15T19:33:46.283 に答える
0

これはパーミッションの問題だと確信しています。GDI+ はネイティブ コンポーネントであり、通常のファイル保存などとは異なるアクセス許可が必要だと思います。これは ASP.NET アプリですか? その場合は、そのフォルダーの IIS プロセスにアクセス許可を付与してください。

于 2009-06-15T19:28:53.673 に答える