如何将图像绘制为整个矩形而与背景无关
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将图像绘制为整个矩形而与背景无关相关的知识,希望对你有一定的参考价值。
我正在使用Graphics.DrawImageUnscaledAndClipped
绘制具有我特定大小的图像,但它没有正确填充矩形或与背景无关。
例如,我有一个尺寸为57x43的图像,我希望通过将图像拉伸到尺寸为240x240的图像来填充图像:
示例代码:
var image = Image.FromFile(mySourceImageFile);
var bmp = new Bitmap(240, 240);
var rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
using (var g = Graphics.FromImage(bmp))
{
// ... some other codes
g.Clear(Color.Aqua); // I use this to highlight whole image
// ... some other codes
g.DrawImageUnscaledAndClipped(image, rect);
// ... some other codes
}
bmp.Save(myDestinationImageFile);
我应该在我的目标图像文件中添加,我在底部有5条像素线,右边有4条线条受到背景影响,这是不期望的! 如何在不受当前背景影响的情况下绘制图像或剪切图像以填充矩形?
我还应该补充一点,这是我创建目标图像的一部分,我知道只是调整大小我可以使用Bitmap(image, w, h)
。
与使用g.DrawImage(new Bitmap(image, 240, 240), 0, 0);
相同的结果
答案
我发现忽略背景我可以将CompositingMode
设置为CompositingMode.SourceCopy
。
CompositingMode.SourceCopy 指定在渲染颜色时,它会覆盖背景颜色。
所以我最好尝试使用它是:
var image = Image.FromFile(mySourceImageFile);
var bmp = new Bitmap(240, 240);
var rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
using (var g = Graphics.FromImage(bmp))
{
g.CompositingMode = CompositingMode.SourceCopy;
// And some other settings to improve quality
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.SmoothingMode = SmoothingMode.HighQuality;
g.Clear(Color.Aqua); // I use this to highlight whole image
// ... some other codes
g.DrawImageUnscaledAndClipped(image, rect);
// ... some other codes
}
bmp.Save(myDestinationImageFile);
更新:
有一个非常糟糕的hacky方式来获得更好的效果可以是这个 - 不推荐 - :
使用比原始图像更大的tempBmp
和一些重复的部分,并在调整大小时使用它而不是原始图像,如下所示:
var image = Image.FromFile(mySourceImageFile);
var bmp = new Bitmap(240, 240);
var tempBmp = new Bitmap(image.Width + 4, image.Height + 5);
using (var g = Graphics.FromImage(tempBmp))
{
g.DrawImage(image, 0, 0);
g.DrawImage(image, 4, 0);
g.DrawImage(image, 0, 5);
g.DrawImage(image, 4, 5);
g.DrawImage(image, 2, 0);
g.DrawImage(image, 2, 1);
g.DrawImage(image, 0, 2);
g.DrawImage(image, 1, 2);
g.DrawImage(image, 4, 2);
g.DrawImage(image, 3, 2);
g.DrawImage(image, 2, 5);
g.DrawImage(image, 2, 4);
g.DrawImage(image, 2, 3);
g.DrawImage(image, 2, 2);
}
using (var g = Graphics.FromImage(bmp))
{
// ... some other codes
g.Clear(Color.Aqua); // I use this to highlight whole image
// ... some other codes
var imageRect = new Rectangle(2, 2, image.Width, image.Height);
var drawRect = new Rectangle(0, 0, bmp.Width, bmp.Height);
g.DrawImage(tempBmp, drawRect, imageRect, GraphicsUnit.Pixel);
// ... some other codes
}
bmp.Save(myDestinationImageFile);
所以,我正在等待更好的解决方案;)。
以上是关于如何将图像绘制为整个矩形而与背景无关的主要内容,如果未能解决你的问题,请参考以下文章