Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何解决使用GDI+;缩放位图时出现的灰度帧问题;_C#_Image Processing_Gdi+ - Fatal编程技术网

C# 如何解决使用GDI+;缩放位图时出现的灰度帧问题;

C# 如何解决使用GDI+;缩放位图时出现的灰度帧问题;,c#,image-processing,gdi+,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 =

我正在尝试使用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消耗更少的方法


有什么想法吗?

好的。经过进一步挖掘,我找到了它

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);

尝试添加一个alpha覆盖,在所有侧面都有一个或两个额外的透明像素。这应该比使用显式或隐含的纯色边框获得更好的结果。虽然转换为RGBA并添加帧的执行成本较高,但如果您真的对高质量感兴趣并且不想切换图形库,这可能是一条可行的道路。

用白色填充不太可能有帮助,现在您的边缘变白了。四处寻找更好的图形库,但是总会有一些边缘效果。帧中需要的额外像素数取决于缩放因子和图形库本身(“一个或两个”可能无法剪切)。您可以推荐其他图形库吗?我只需要基本的图像操作(缩放、旋转、平移…),但质量至少应该和GDI+最佳质量一样好。也许是GDI(相对于GDI+)或DirectX。如果你的大多数图像都非常非常小(例如(实际上,在源和目标图像中,可能都比16像素小得多,而Anticrain当然也可能比DirectX慢。)如果是我,我可能会开始使用GDI。