如何将图像绘制为整个矩形而与背景无关

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

我的源图像文件: My 57x43 Jpeg file

我的目标图片文件: enter image description here

我应该在我的目标图像文件中添加,我在底部有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);

但是这个解决方案的边界图像感觉模糊!!! enter image description here

更新: 有一个非常糟糕的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);

我的目标图像文件是: My destination image file

所以,我正在等待更好的解决方案;)。

以上是关于如何将图像绘制为整个矩形而与背景无关的主要内容,如果未能解决你的问题,请参考以下文章

将旋转的图像转换为矩形左上角

如何在WPF中绘制具有背景颜色的矩形

如何在uitableviewcell内绘制一个矩形

如何使 img 和 text 链接都链接到同一个地方,并且在悬停时都变得活跃,而与我悬停在哪个位置无关?

OpenGL:在背景图像上使用蒙版绘制颜色

如何在 iPad 中用手指在图像视图上绘制矩形后将图像保存在照片库中?