代码之家  ›  专栏  ›  技术社区  ›  Matt Wilko kingecg

当重叠两个相同大小的图像时,一个是偏移

  •  2
  • Matt Wilko kingecg  · 技术社区  · 8 年前

    我正试图通过将一个叠加在另一个之上来创建图像。代码可以工作,但我覆盖的图像似乎有点拉伸,我无法理解为什么。

    所以代码只创建了一个空白的红色24x24矩形,然后我覆盖了一个24x24 png文件,如下所示:

    enter image description here

    我期待的是:

    enter image description here

    但我实际上明白了这一点:

    enter image description here

    Using backGround As New Bitmap(24, 24, Imaging.PixelFormat.Format32bppArgb)
            Using g = Graphics.FromImage(backGround)
                Using brush1 As New SolidBrush(Color.Red)
                    g.FillRectangle(brush1, 0, 0, 24, 24)
                    Using topimage = Image.FromFile("C:\Scratch\ManNoRecords24.png")
                        g.DrawImage(topimage, New Point(0, 0))
                    End Using
                End Using
            End Using
            backGround.Save("C:\Scratch\Emp.png", Imaging.ImageFormat.Png)
        End Using
    

    显示topImage属性的调试器:

    enter image description here

    1 回复  |  直到 8 年前
        1
  •  4
  •   Jens    8 年前

    您可以使用

    g.DrawImageUnscaledAndClipped(topimage, New Rectangle(0, 0, 24, 24))
    

    而是在绘制源图像时避免源图像的任何缩放。这是有效的,但我实际上不太确定你的解决方案有什么问题。

    Reference Source , DrawImageUnscaledAndClipped 似乎在使用 Pixel 作为图像大小的默认单位,因此忽略源图像的DPI设置:

    /// <include file='doc\Graphics.uex' path='docs/doc[@for="Graphics.DrawImageUnscaledAndClipped"]/*' />
    /// <devdoc>
    /// </devdoc>
    public void DrawImageUnscaledAndClipped(Image image, Rectangle rect) {
        if(image == null) {
            throw new ArgumentNullException("image");
        }
    
        int width = Math.Min(rect.Width, image.Width);
        int height = Math.Min(rect.Height, image.Height);
    
        //We could put centering logic here too for the case when the image is smaller than the rect
        DrawImage(image, rect, 0, 0, width, height, GraphicsUnit.Pixel);
    }
    

    DrawImage DrawImageUnscaled 不要,然后可能会根据其内部DPI设置重新缩放图像,Matt发现该设置小于默认值96,这会导致图像拉伸:

    /// <include file='doc\Graphics.uex' path='docs/doc[@for="Graphics.DrawImageUnscaled"]/*' />
    /// <devdoc>
    /// </devdoc>
    public void DrawImageUnscaled(Image image, Point point) {
        DrawImage(image, point.X, point.Y);
    }