2009-06-03 2 views
4

이 코드를 사용하면 jpg 이미지를 png 8로 변환 할 수 있습니다. 코드는 작동하지만 이미지는 거칠게 보입니다. 나는 Photoshop에서 png 8로 내보내기를 수행 했으므로 더 부드러워 보이지 않았다.PngBitmapEncoder 클래스로 인해 이미지가 거칠게 보이게하는 이유는 무엇입니까?

: 거기 밖으로 도울 수있는 8 비트 PNG

모든 이미지 전문가?

내 코드 :

Image ImageFile = Image.FromFile(@"C:\Documents and Settings\dvela\My Documents\Downloads\pngtest\Batman01.jpg"); 
Rectangle NewSize = new Rectangle(); 
NewSize.Width = 112; 
NewSize.Height = (NewSize.Width * ImageFile.Height)/ImageFile.Width; 

Bitmap image = new Bitmap(NewSize.Width, NewSize.Height); 

Graphics graphics = Graphics.FromImage(image); 
graphics.CompositingQuality = CompositingQuality.HighQuality; 
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 
graphics.SmoothingMode = SmoothingMode.HighQuality; 

graphics.DrawImage(ImageFile, NewSize); 

FormatConvertedBitmap fcb = new FormatConvertedBitmap(System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(image.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromWidthAndHeight(NewSize.Width, NewSize.Height)), PixelFormats.Indexed8, BitmapPalettes.Halftone256Transparent, 0.5); 

PngBitmapEncoder pngBitmapEncoder = new PngBitmapEncoder(); 
pngBitmapEncoder.Interlace = PngInterlaceOption.Off; 
pngBitmapEncoder.Frames.Add(BitmapFrame.Create(fcb)); 

using (Stream fileStream = File.Open(@"C:\Documents and Settings\dvela\My Documents\Downloads\pngtest\test.png", FileMode.Create)) 
{ 
    pngBitmapEncoder.Save(fileStream); 
} 
+0

두 그림을 게시하거나 그 버전을자를 수 있습니까? –

답변

1

팔레트 기반 및 Octree 기반 색상 양자화를 수행하는 this library이 발견되었습니다.

MSDN article은 코드와 알고리즘의 차이점을 설명합니다.

+0

링크가 대부분 깨졌습니다 –

+0

링크가 업데이트되었습니다. Microsoft는 링크를 유지하는 끔찍한 일을하는 것으로 유명합니다. 그래서 Web Archive에 대한 링크로 바뀌 었습니다. –

3

당신은 변환 된 이미지에 대한 256 색 고정 된 팔레트를 사용하고 있습니다. Photoshop은 아마도 해당 이미지 용으로 특별히 생성 된 팔레트를 사용하고 모든 색상 (또는 대부분)을 포함합니다.

dithering을 사용하거나 custom palette 또는 둘 다를 생성 할 수 있습니다.

일부 추가 정보는 here입니다.

+0

필자는 Photoshop에서 색상 표를 비교해 보았습니다. 사용자 정의 팔레트를 만들 수있는 라이브러리가 있습니까? –

+0

나는 C#을 전혀 모른다. 그래서 나는 이것을 도울 수 없다. – cube

+0

+1 올바른 방향으로 나를 가리키며 정확한 베지를 주었기 때문에 대답을 찾을 수있었습니다. –

관련 문제