如何在没有外边框额外像素的情况下在 Graphics 上绘制图像?
How to draw image on Graphics without extra pixels at outer borders?
这个简单的代码给我带来了非常糟糕的结果。
Image global_src_img = Image.FromFile(Application.StartupPath + "\src.png");
Image src_img = ((Bitmap)global_src_img).Clone(new Rectangle(160, 29, 8, 14), PixelFormat.Format32bppArgb);
src_img.Save(Application.StartupPath + "\src_clonned.png", ImageFormat.Png);
Bitmap trg_bmp = new Bitmap(100, 100);
Graphics gfx = Graphics.FromImage(trg_bmp);
gfx.FillRectangle(new Pen(Color.FromArgb(255, 0, 0, 0)).Brush, 0, 0, trg_bmp.Width, trg_bmp.Height);
gfx.DrawImageUnscaled(src_img, (trg_bmp.Width / 2) - (src_img.Width / 2), (trg_bmp.Height / 2) - (src_img.Height / 2));
gfx.Dispose();
trg_bmp.Save(Application.StartupPath + "\trg.png", ImageFormat.Png);
它用字母克隆了大图像的一部分并将其写入另一个图像。
写入的图像在外边界处有额外的像素,这些像素在源图像和克隆图像中不存在。
如何避免?
这是克隆图像 (src_clonned.png
),稍后将在图形上绘制。
这是保存的结果图像 (trg.png
)。
直接在位图上绘制以避免任何像素修改:
public static void DrawImgOnImg(Image src, Bitmap trg, int x, int y)
{
for (int i = x; i < x + src.Width; i++)
for (int j = y; j < y + src.Height; j++)
{
Color src_px = ((Bitmap)src).GetPixel(i - x, j - y);
trg.SetPixel(i, j, src_px);
}
}
这个简单的代码给我带来了非常糟糕的结果。
Image global_src_img = Image.FromFile(Application.StartupPath + "\src.png");
Image src_img = ((Bitmap)global_src_img).Clone(new Rectangle(160, 29, 8, 14), PixelFormat.Format32bppArgb);
src_img.Save(Application.StartupPath + "\src_clonned.png", ImageFormat.Png);
Bitmap trg_bmp = new Bitmap(100, 100);
Graphics gfx = Graphics.FromImage(trg_bmp);
gfx.FillRectangle(new Pen(Color.FromArgb(255, 0, 0, 0)).Brush, 0, 0, trg_bmp.Width, trg_bmp.Height);
gfx.DrawImageUnscaled(src_img, (trg_bmp.Width / 2) - (src_img.Width / 2), (trg_bmp.Height / 2) - (src_img.Height / 2));
gfx.Dispose();
trg_bmp.Save(Application.StartupPath + "\trg.png", ImageFormat.Png);
它用字母克隆了大图像的一部分并将其写入另一个图像。 写入的图像在外边界处有额外的像素,这些像素在源图像和克隆图像中不存在。 如何避免?
这是克隆图像 (src_clonned.png
),稍后将在图形上绘制。
这是保存的结果图像 (trg.png
)。
直接在位图上绘制以避免任何像素修改:
public static void DrawImgOnImg(Image src, Bitmap trg, int x, int y)
{
for (int i = x; i < x + src.Width; i++)
for (int j = y; j < y + src.Height; j++)
{
Color src_px = ((Bitmap)src).GetPixel(i - x, j - y);
trg.SetPixel(i, j, src_px);
}
}