如何使用GDI +缩放位图时解决灰色框架问题

时间:2010-01-08 00:44:26

标签: c# image-processing gdi+

我正在尝试通过执行以下操作来使用GDI +缩小位图:

Bitmap newImage = new Bitmap(NewWidth, NewHeight, Im.PixelFormat);           
Graphics g = Graphics.FromImage(newImage);

g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

g.ScaleTransform(0.1, 0.1); // 10%
g.DrawImage(Im, 0, 0, Im.Width, Im.Height);

Im是原始图像,NewWidth和NewHeight是10%或原始图像。我已经在1000x1000图像上测试了这个(缩小到100x100)

按照承诺的高质量正确完成缩放,但由于某种原因,左边,右边和顶边有一个灰色边框(底部没有)。

我认为这是因为所有图像边框都是白色,而位图的“外部”颜色默认为黑色,因此一些默认黑色会混合到缩放插值中。

我找了一种方法将默认背景颜色设置为白色(白色会很好),但无法在任何地方找到它。

我的另一种选择是使用白框填充边框,缩小图像并裁剪它但是我想知道是否有更简单且耗费更少CPU的方式?

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

好。经过一番挖掘,我找到了它。

System.Drawing.Imaging.ImageAttributes Att = new System.Drawing.Imaging.ImageAttributes();
Att.SetWrapMode(System.Drawing.Drawing2D.WrapMode.Clamp, System.Drawing.Color.White); 
g.DrawImage(Im, new Rectangle(0,0,Im.Width,Im.Height), 0, 0, Im.Width, Im.Height, GraphicsUnit.Pixel, Att);

答案 1 :(得分:0)

尝试在所有面上添加一个带有额外透明像素的Alpha叠加层。与使用显式或隐含的纯色帧相比,这应该得到更好的结果。虽然转换为RGBA并添加帧具有更高的执行成本,但如果您真的对高质量感兴趣并且不想切换图形库,那么它可能是最佳选择。