首页 > 解决方案 > 图像未在正确的位置绘制

问题描述

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)。另外,我需要黑色背景。

那么,发生了什么以及如何纠正这个问题?

标签: c#.netwinformsimage-processinggdi+

解决方案


您正在加载图像,然后使用以下命令创建此源的副本:
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 ResolutionPixelFormat.


推荐阅读