c# - 如何将图像绘制到整个矩形并且与背景无关
问题描述
我正在使用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);
所以,我正在等待更好的解决方案;)。
推荐阅读
- android - 在颤振中弹出新的论点。?
- swift - 从 SPM 包访问 AppIcon 和启动图像
- html - 未应用 css 样式
- prestashop - 添加订单的列号列表
- python - Pyspark:找到高斯混合模型的最佳 k 值
- docker - 没有在 nginx ssl 后面发送 ory kratos csrf cookie
- java - 对话框打开时如何暂停活动?
- android - 数据绑定设置的数据不显示在视图中
- flutter - Flutter - 如果文本字段为空,如何防止在文本字段中调用“onChanged”?
- amazon-web-services - 摄取时 CSV 文件(在新事件下)出现奇怪的“不支持文件格式”错误