2014-02-14 3 views
0

품질을 저하시키지 않고 색인화 된 비트 맵을 색인화되지 않은 것으로 변환 할 수 있습니까?비트 맵을 압축/품질 손실없이 색인화되지 않은 픽셀 형식으로 변환

다음
public Bitmap CreateNonIndexedImage(Image src) 
     { 
      Bitmap newBmp = new Bitmap(src.Width, src.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

      using (Graphics gfx = Graphics.FromImage(newBmp)) 
      { 
       gfx.DrawImage(src, 0, 0); 
      } 

      return newBmp; 
     } 

는 인덱스 비트 맵 :

나는 현재 변환이 코드를 사용 http://puu.sh/6VO1N.png

그리고이 변환 된 이미지입니다 :

http://puu.sh/6VO2Q.png 내가 정확하게 일하기 위해 색인화되지 않은 필요 색인 된 것과 동일하지만 무엇을해야할지 모르겠다.

+0

아마도 'SmoothingMode'를 None으로 설정해야 할 것입니다. –

+0

이것은 작동하지 않습니다. @ L.B – Hobbit9797

+0

누가 나중에 보게되면 ... 이는 DPI 때문입니다. 원래의 너비와 높이를 단지 좌표가 아닌'DrawImage'에 부여하면 사각형에 의해 주어진 '스케일링'이 DPI 스케일링보다 우선하기 때문에이 문제를 해결합니다. – Nyerguds

답변

1

이미지를 다시 샘플링했습니다. 이것은 일반적으로 좋은 것입니다. 원본 이미지의 디더링 아티팩트를 제거하는 데 도움이됩니다. 그러나 당신은 그것을 좋아하지 않으므로 보간을 꺼야합니다. 또한 원래 이미지의 해상도로 인해 크기가 재조정되지 않도록하는 DrawImage() 오버로드를 사용해야합니다. 실제로 이미지에 문제가 없지만 다른 이미지와 하나가 될 수 있습니다. 따라서 :

public static Bitmap CreateNonIndexedImage(Image src) { 
     Bitmap newBmp = new Bitmap(src.Width, src.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

     using (Graphics gfx = Graphics.FromImage(newBmp)) { 
      gfx.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.None; 
      gfx.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; 
      gfx.DrawImage(src, new Rectangle(0, 0, src.Width, src.Height)); 
     } 

     return newBmp; 
    } 
관련 문제