而不通过取一个象素把它模糊成四个具有不同尺寸的新图像上放大图像(Enlarging an image

2019-10-19 10:53发布

我以前写该放大图像,而无需通过加倍图像尺寸,使一个像素到四个像素的新图像上模糊的图像放大器算法。 这原本是专为500×500像素的图片,它的工作绝对没问题,但现在我需要使用它具有不同的宽度和高度的图像。

我试图改变的值,但我不能让它工作,有可能缺少些什么,但我不知道。 有人可以帮助解决这个问题,因此具有不同尺寸的作品? 它始建于500×500放大像素的图片,但我需要放大图像为634x490像素。

与500×500工作的原代码如下,如果您将其粘贴这将工作到项目并运行它,但你必须提供500×500像素的图片吧:

        Bitmap oldImg = new Bitmap(Image.FromFile(@"NameOfImageToEnlarge.png"));
        Bitmap newImg = new Bitmap(1000, 1000);

        System.Drawing.Imaging.BitmapData data = oldImg.LockBits(new Rectangle(0, 0, 500, 500), System.Drawing.Imaging.ImageLockMode.ReadOnly, oldImg.PixelFormat);
        oldImg.UnlockBits(data);
        byte[] rgba = new byte[data.Stride * 500];
        System.Runtime.InteropServices.Marshal.Copy(data.Scan0, rgba, 0, data.Stride * 500);

        using (Graphics g = Graphics.FromImage(newImg))
        {
            for (int x = 0; x < 500; x++)
            {
                for (int y = 0; y < 500; y++)
                {
                    newImg.SetPixel(x * 2, y * 2, Color.FromArgb(oldImg.GetPixel(x, y).ToArgb()));
                    newImg.SetPixel(x * 2 + 1, y * 2, Color.FromArgb(oldImg.GetPixel(x, y).ToArgb()));
                    newImg.SetPixel(x * 2, y * 2 + 1, Color.FromArgb(oldImg.GetPixel(x, y).ToArgb()));
                    newImg.SetPixel(x * 2 + 1, y * 2 + 1, Color.FromArgb(oldImg.GetPixel(x, y).ToArgb()));
                }
            }
            newImg.Save(@"NameOfImageToSave.png");
        }

我还用了一些帮助,以得到上面的代码工作,所以我可能会更这里解释它: 从一个图像拍摄像素和扩大他们的新形象上打造原创的放大版。

Answer 1:

你并不需要这样做。 您正在使用被称为“近邻”插补方法; 您可以设置该属性,然后调用DrawImage和你所有的设置:

using(Bitmap source = ...)
using(Bitmap destination = new Bitmap(1000, 1000))
using(Graphics g = Graphics.FromImage(newImg)) {

    g.InterpolationMode = InterpolationMode.NearestNeighbor;
    g.DrawImage( source, new Rectangle( 0, 0, destination.Width, destination.Height ) );
}

另外,如果你使用GetPixelSetPixel没有必要使用LockBits 。 事实上,在你的榜样,你叫LockBits ,然后立即打电话UnlockBits ,而是从静止读取BitmapData的指针,这是危险的,可能会导致数据损坏如果GC四处移动存储器中,而执行代码。



文章来源: Enlarging an image without blurring by taking one pixel and turning it into four on a new image with different dimensions