CSharp Windows窗体Picturebox绘制没有质量损失的小图像

时间:2017-08-12 20:06:04

标签: c# image winforms

我正在尝试使用Windows Forms为我的monogame项目创建一个关卡编辑器,并且需要在缩放时将基于小像素的图像绘制到一个没有质量损失的图片框。在monogame中,当我需要这样做时,我可以将绘图类型设置为PointClamp,然后按原样绘制每个像素,而不是在缩放时像素化;我希望通过图片框这样的东西。现在它看起来像this但是我更喜欢像this这样更清晰干净的图像(第二种是它会以单一的方式出现)。我没有为此上传任何代码,但只是假设我从文件流中抓取了一个图像并使用位图构造函数来扩展它(不要认为它是相关的,但我只是把它放在那里)。

Image croppedImage, image = tileMap.tileBox.Image;
var brush = new SolidBrush(Color.Black);

try { croppedImage = CropImage(image, tileMap.highlightedRect); } catch {
    return; // If crop target is outside bounds of image then return
}

float scale = Math.Min(higlightedTileBox.Width / croppedImage.Width, higlightedTileBox.Height / image.Height);

var scaleWidth = (int)(higlightedTileBox.Width * scale);
var scaleHeight = (int)(higlightedTileBox.Height * scale);

try { higlightedTileBox.Image = new Bitmap(croppedImage, new Size(scaleWidth, scaleHeight)); } catch {
    return; // Image couldn't be scaled or highlighted tileBox couldn't be set to desired image
}

CropImage:

private static Image CropImage(Bitmap img, Rectangle cropArea) {
    return img.Clone(cropArea, img.PixelFormat);
}

private static Image CropImage(Image img, Rectangle cropArea) {
    return CropImage(new Bitmap(img), cropArea);
}

上面的代码是我当前的方法。 tileMap是一个表单,而tilebox是该表单中的图片框.image是在被裁剪为用户突出显示的内容之前的完整spritesheet纹理。裁剪后,我尝试将当前的图片框(highlightTileBox的)图像设置为裁剪图像的放大版本。

1 个答案:

答案 0 :(得分:1)

所以我尝试了一下解决方案。 看起来直接按大小缩放图像是使用某种插值。 为了尝试Winforms支持的不同插值模式,我创建了一个小演示。 如您所见,每个标签都包含InterpolationMode的名称,后跟其生成的图像。我使用的原始位图是顶部的小位图。 enter image description here 从您的问题来看,您似乎想要实现像NearestNeighbour这样的东西。

以下代码缩放bmp,结果存储在bmp2中。试试这是否是你想要的。如果您将此作为解决方案(处置未使用的位图等),请考虑构建正确的实现。 我希望它有所帮助。

        Bitmap bmp = new Bitmap("test.bmp");
        Bitmap bmp2;
        Graphics g = Graphics.FromImage(bmp2=new Bitmap(bmp.Width * 2, bmp.Height * 2));
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
        g.DrawImage(bmp, 0, 0, bmp.Width * 2, bmp.Height * 2);
        g.Dispose();