使用RotateTransform()时Graphics.DrawImage()剪辑图像

我有以下代码在4个方向上绘制我的border2.bmp

private void Form1_Paint(object sender, PaintEventArgs e)
{
    Bitmap border = new Bitmap("border2.bmp");
    int borderThick = border.Height;

    Graphics g = e.Graphics;
    Size region = g.VisibleClipBounds.Size.ToSize();

    Rectangle desRectW = new Rectangle(0, 0, region.Width - borderThick, borderThick);

    // 1. LEFT - RIGHT border
    g.TranslateTransform(30, 30);
    g.DrawImage(border, desRectW, desRectW, GraphicsUnit.Pixel);

    // 2. UP - BUTTOM border
    g.ResetTransform();
    g.TranslateTransform(50, 50);
    g.RotateTransform(90);
    g.DrawImage(border, desRectW, desRectW, GraphicsUnit.Pixel);

    // 3. RIGHT-LEFT border
    g.ResetTransform();
    g.TranslateTransform(100, 100);
    g.RotateTransform(180);
    g.DrawImage(border, desRectW, desRectW, GraphicsUnit.Pixel);

    // 4. BOTTOM - UP border
    g.ResetTransform();
    g.TranslateTransform(150, 150);
    g.RotateTransform(270);
    g.DrawImage(border, desRectW, desRectW, GraphicsUnit.Pixel);
}

我的原始图片是:

使用RotateTransform()时Graphics.DrawImage()剪辑图像

但是轮换的结果并不完全符合我的预期. 90度缺少第一个红线,270度缺少第一个黑柱,而180度都缺少.

就像我所附的图片:

使用RotateTransform()时Graphics.DrawImage()剪辑图像

PS:您可以在以下地址获得border2.bmp:http://i.imgur.com/pzonx3i.png

编辑:
我尝试了g.PixelOffsetMode = PixelOffsetMode.HighQuality;就像@Peter Duniho的评论一样,但我发现它也无法正确绘制.
示例:4行不在我们期望的相同位置开始.

g.TranslateTransform(50, 50);

// LEFT - RIGHT border
g.DrawLine(Pens.Red, 0, 0, 100, 0);

// UP - BOTTOM border
g.RotateTransform(90);
g.DrawLine(new Pen(Color.FromArgb(128, Color.Blue)), 0, 0, 100, 0);

// RIGHT-LEFT border
g.RotateTransform(90);
g.DrawLine(new Pen(Color.FromArgb(128, Color.Green)), 0, 0, 100, 0);

// BOTTOM - UP border
g.RotateTransform(90);
g.DrawLine(new Pen(Color.FromArgb(128, Color.Gray)), 0, 0, 100, 0);

解决方法:

我无法真正解释为什么会发生这种情况,除了任何图形API都必须包含可能有时导致不精确行为的优化之外,似乎您在这里遇到了这种情况.

在您的特定示例中,可以在绘制图像之前通过在代码中添加以下语句来纠正问题:

g.PixelOffsetMode = PixelOffsetMode.HighQuality;

将其设置为Half也可以.它等效于HighQuality(或者从技术上讲,HighQuality等效于它……但我发现HighQuality在代码中更具描述性:)).

这会稍微降低位图的渲染速度,但可能不会以用户可以感知的方式降低其速度.

尽管.NET文档在描述此设置方面不是很有帮助,但是针对同一功能的本机Win32文档则有更多详细信息:
PixelOffsetMode enumeration.从描述中可以推断出,如果像素的逻辑中心为(0,0),则旋转时可能会丢失一个边缘上的像素(和/或获得另一边缘上的像素).切换到Half可解决此问题.

上一篇:c#-启用和禁用按钮,基于某些条件的标签


下一篇:C#从CSV文件读取字符串并绘制折线图