2014-03-01 8 views
0

이전에 이미지 크기를 두 배로 늘리고 단일 픽셀을 네 픽셀로 만드는 이미지 흐림없이 이미지를 확대하는 알고리즘을 작성했습니다 새로운 이미지. 이것은 원래 500x500 픽셀 이미지 용으로 제작되었으며 완전히 잘 작동했지만 이제는 너비와 높이가 다른 이미지에 사용해야합니다.하나의 픽셀을 취하여 크기가 다른 새 이미지에서 4 개로 바꾸어 흐림없이 이미지 확대

값을 변경하려고 시도했지만 작동하지 못하고 누락 된 부분이 있지만 잘 모르겠습니다. 다른 사람이이를 수정하여 다른 차원에서 작동하도록 할 수 있습니까? 500x500 픽셀 이미지를 확대하기 위해 제작되었지만 확대해야하는 이미지는 634x490 픽셀입니다.

500x500 작동 원래 코드는 다음과 같습니다 이것은 당신이 그것을 붙여 넣으면 프로젝트에 작동하고 실행하지만 당신은 그것에 500x500 픽셀 이미지를 제공해야합니다 :

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

가 나는 또한 도움을 사용 위의 코드를 사용하면 더 자세히 설명 할 수 있습니다. Taking pixels from one image and enlarging them on a new image to create a larger version of original

답변

3

이렇게하지 않아도됩니다. 사용중인 접근 방식을 "Nearest Neighbor"보간이라고합니다. 이 속성을 설정 한 다음 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)); 
} 

을 또한,이 LockBits를 사용할 필요가 없습니다 GetPixelSetPixel를 사용하는 경우. 실제로 예제에서 LockBits을 호출 한 다음 즉시 UnlockBits을 호출하지만 BitmapData의 포인터에서 읽으면 여전히 위험하며 코드가 실행되는 동안 GC가 메모리를 이동하면 데이터가 손상 될 수 있습니다.

+0

고맙습니다! 메모리가 더 좋게 들리는 짧은 코드와 출력 할 이미지의 너비와 높이를 변경하는 것만으로 간단합니다. 다시 한 번 감사드립니다. –