Как нарисовать изображение на графике без лишних пикселей на внешних границах? - PullRequest
0 голосов
/ 27 мая 2018

Этот простой код дает мне очень плохой результат.

            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), которое позже будет нарисовано на графике.enter image description here

Сохраняется результирующее изображение (trg.png).enter image description here

1 Ответ

0 голосов
/ 29 мая 2018

Рисуйте прямо на растровом изображении, чтобы избежать любых изменений пикселей с помощью:

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);
        }
}
...