我有以下代码来处理流中的图像。我的目的是选择一个子区域并将其调整为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);
出于某种原因,这是我想要的子区域,调整大小并将其放在原始图像的顶部,这样结果就是原始图像和我想要的结果的混合。
我已经通过几个指南,关于图像处理的帖子,但我仍然不确定我在哪里错了。你介意帮帮我吗?
另外,如果你还向我解释我缺少什么(代码背后的一点理论),我真的很感激。
谢谢!
答案 0 :(得分: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);
我还建议在using
语句中包装所有GDI +对象,因为它们通常不能很好地处理垃圾回收。