【问题标题】:Blit pixels from one image to bitmap without scaling从一张图像到位图的 Blit 像素,无需缩放
【发布时间】:2020-11-06 09:33:15
【问题描述】:

我正在使用从文件创建图像

var img = Image.FromFile(openFileDialog1.FileName);

我还创建了一个相同大小的位图

var bmp = new Bitmap(img.Width, img.Height);

var g = Graphics.FromImage(bmp);

然后我使用从图像绘制位图

var r = new Rectangle(tileoffsetx, tileoffsety, tilewidth, tileheight);

g.DrawImage(img, destx, desty, r, GraphicsUnit.Pixel);

我也试过

var r = new Rectangle(tileoffsetx, tileoffsety, tilewidth, tileheight);

g.SetClip(r);

g.DrawImageUnscaled(img, destx, desty);

在这两种情况下,我都得到了意外的缩放。 (即使我使用的是 DrawImageUnscaled 版本)。

在这两种情况下,我得到的结果大约是原始大小的 1/3。

这似乎与图像的分辨率为 300 像素/英寸而位图的分辨率为 96 像素/英寸的事实相对应。

无论像素/英寸如何,如何复制像素?

【问题讨论】:

  • 如果没有可靠地重现问题的良好 minimal reproducible example,您可能会发现对提供好的答案缺乏兴趣(尽管您可能会得到一些“在黑暗中拍摄”,以及谁知道,也许其中之一会有所帮助)。从您的问题中不清楚原始源图像是什么(另一个位图?),如果它是位图,为什么您不只是使用它而不是复制它(因为您似乎希望新位图与原始位图大小相同) .您是否考虑过简单地将新位图的分辨率设置为与原始位图相同?您的问题缺少许多重要细节。
  • 您需要将两个图形对象设置为相同的 dpi 分辨率。选哪个!
  • 用 GDI+ 绘图是一团糟,不要对任何事情感到惊讶。您是否尝试过需要 2 个矩形的 DrawImage 重载?明确指定源和目标矩形,包括宽度和高度。另外,请忽略 DrawImageUnscaled 方法,您不会发现它们有用。
  • @AndersLindén 不要想太多。 stackoverflow 的当前状态是:不知道答案 -> downvote & close-vote。

标签: c# system.drawing


【解决方案1】:

我尝试了 cmets 的一个想法,使用需要 2 个矩形的 drawImage 形式。就像

var srcrect = new Rectangle(tileoffsetx, tileoffsety, tilewidth, tileheight);
var destrect = new Rectangle(destx, desty, tilewidth, tileheight);

g.DrawImage(img, destrect, srcrect, GraphicsUnit.Pixel);

成功了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多