1

ストリームからの画像を操作するための次のコードがあります。私の意図は、そのサブリージョンを選択して、100x100にサイズ変更することです。画像のフォーマットは事前にわかりません。

var image = new Bitmap(stream);

var destArea = new Rectangle(0, 0, 100, 100);
var srcArea = new Rectangle(x, y, width, height);

var gfx = Graphics.FromImage(image);
gfx.DrawImage(image, destArea, srcArea, GraphicsUnit.Pixel);

var ms = new MemoryStream();
image.Save(ms, image.RawFormat);

何らかの理由で、これは必要なサブ領域を取得し、サイズを変更して元の画像の上に配置することで、元の結果と目的の結果が混在する結果になります。

私はいくつかのガイド、画像処理に関する投稿を経験しましたが、どこが間違っているのかまだわかりません。手伝ってくれませんか。

また、私が欠けているのは何であるか(コードの背後にある少しの理論)も説明していただければ幸いです。

ありがとう!

4

1 に答える 1

1

画像のサイズを変更する場合は、サイズ変更した画像を配置する新しい画像オブジェクトが必要になります。不足しているのは、新しい100x100イメージの作成です。コードは次のようになります。

var image = new Bitmap(stream);
var destArea = new Rectangle(0, 0, 100, 100);
var srcArea = new Rectangle(x, y, width, height);

// Destination image
var destImage = new Bitmap(destArea.Width, destArea.Height);

var gfx = Graphics.FromImage(destImage);
gfx.DrawImage(image, destArea, srcArea, GraphicsUnit.Pixel);

var ms = new MemoryStream();
destImage.Save(ms, image.RawFormat);

また、すべてのGDI +オブジェクトをステートメントでラップすることをお勧めしますusing。これらは通常、ガベージコレクションではうまく機能しないためです。

于 2012-05-07T02:11:31.213 に答える