c# - 图像未在正确的位置绘制
问题描述
Bitmap image = ReadBitmap("image.png");
Bitmap imageCopy = new Bitmap(image);
Bitmap canvas = new Bitmap(imageCopy.Width+100, imageCopy.Height);
// From this bitmap, the graphics can be obtained, because it has the right PixelFormat
using(Graphics g = Graphics.FromImage(canvas))
{
// Draw the original bitmap onto the graphics of the new bitmap
g.DrawImage(image, 0, 0);
}
// Use tempBitmap as you would have used originalBmp
InputPictureBox.Image = image;
OutputPictureBox.Image = canvas;
我还没有理解这个 c# 代码的输出。
原始图像未放置在正确的位置。它应该在(0, 0)
。另外,我需要黑色背景。
那么,发生了什么以及如何纠正这个问题?
解决方案
您正在加载图像,然后使用以下命令创建此源的副本:
Bitmap bitmap = new Bitmap();
当您以这种方式创建图像的副本时,您会牺牲/更改一些细节:
Dpi 分辨率:如果未另行指定,则将分辨率设置为 UI 分辨率。96 Dpi,作为标准;不同的屏幕分辨率和缩放比例可能会有所不同。使用中的系统也会影响此值(Windows 7 和 Windows 10 可能/可能会提供不同的值)
PixelFormat:如果不是直接从图像源复制或明确指定,PixelFormat
则设置为PixelFormat.Format32bppArgb
.
从你所说的,你可能想要这样的东西:
using (Bitmap imageSource = (Bitmap)Image.FromFile(@"[SomeImageOfLena]"))
using (Bitmap imageCopy = new Bitmap(imageSource.Width + 100, imageSource.Height, imageSource.PixelFormat))
{
imageCopy.SetResolution(imageSource.HorizontalResolution, imageSource.VerticalResolution);
using (Graphics g = Graphics.FromImage(imageCopy))
{
g.Clear(Color.Black);
g.CompositingMode = CompositingMode.SourceCopy;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(imageSource, (imageCopy.Width - imageSource.Width) / 2, 0);
pictureBox1.Image = (Image)imageSource.Clone();
pictureBox2.Image = (Image)imageCopy.Clone();
}
}
结果是这样的:(
上/下框黑色实际上是Picturebox
背景色)
当原始图像 Dpi 分辨率与创建图像副本时使用的基本 Dpi 分辨率不同时new Bitmap()
,您的结果可能与预期不同。
这是在相同场景中使用 150、96 和 72 Dpi 的源图像时发生的情况:
另一个重要的细节是 Image 对象的IDisposable特性。
当你创建一个时,你必须Dispose()它;显式调用该Dispose
方法,或隐式地将 Image 构造函数包含在Using 语句中。
此外,可能不要分配Image
直接从FileStream
.
GDI+ 将锁定文件,您将无法复制、移动或删除它。
使用该文件,与图像相关的所有资源也将被锁定。
使用new Bitmap()
(如果您不关心上述细节)或使用Image.Clone()进行复制,这将保留 ImageDpi Resolution
和PixelFormat
.
推荐阅读
- python - 使用谷歌存储和谷歌视觉 API
- javascript - 在多级下拉菜单中,如何防止子菜单重叠
- python - 如何使用证书和 rsa 密钥连接到服务器
- tomcat - 登录到 jaspersoft 时重定向循环
- javascript - jQuery - 如何用标签包装输入标签
- amazon-cloudformation - 如何将角色传递给 cli 命令“aws cloudformation deploy”或“sam deploy”?
- ldap - 带有 Liferay 的 LDAP - 存在的未知主机
- google-apps-script - 有没有办法为用户删除谷歌脚本中的保护?
- python - Keras:如何评估模型准确性(evaluate_generator vs. predict_generator)?
- c# - 多对多关系添加项目