2011-01-13 4 views
3

원본 bpp (1 - BnW의 경우, 8 - 회색의 경우, 24- 색)로 이미지를 처리하고 저장해야합니다. 처리 후 나는 항상 24bpp (Aforge.Net로 처리하기 때문에)가 있습니다. 내가 저장 기능에 원래 BPP를 통과하고 내가 절약을 위해 다음 코드를 사용하고 있습니다 :C# Bitmap.Save가 Bitmap의 PixelFormat을 무시하는 이유는 무엇입니까?

private static Bitmap changePixelFormat(Bitmap input, PixelFormat format) 
    { 
     Bitmap retval = new Bitmap(input.Width, input.Height, format); 
     retval.SetResolution(input.HorizontalResolution, input.VerticalResolution); 
     Graphics g = Graphics.FromImage(retval); 
     g.DrawImage(input, 0, 0); 
     g.Dispose(); 
     return retval; 
    } 

내가 전달하는 경우 : "그래픽 개체를 만들 수 없습니다 :

PixelFormat.Format8bppIndexed 

내가 예외를 받고 있어요

Bitmap s = new Bitmap("gray.jpg"); 
     Bitmap NewPicture = s.Clone(new Rectangle(0, 0, s.Width, s.Height),     PixelFormat.Format8bppIndexed); 
: 나는 다음 코드를 시도했습니다

Graphics g = Graphics.FromImage(retval); 

: 라인의 인덱스 픽셀 형식 "의 이미지 이 "NewImage"후

PixelFormat 8bppIndexed가있다,하지만 난 NewImage 저장있을 때 :

NewPicture.Save("hello.jpg", ImageFormat.Jpeg); 

hello.jpg는 24bpp있다.

나는 원본 이미지의 BPP 및 이미지 형식을 유지해야합니다.

왜 Bitmap.Save는 비트 맵의 ​​PixelFormat을 무시?

============================================== =========

고마워, 내가 해결책을 발견했습니다 8 비트 그레이 스케일로 이미지 (특히 JPEG)를 저장할 수있다이 무료 라이브러리의 도움으로 http://freeimage.sourceforge.net/license.html

.

+0

그래서 무엇이 문제입니까? 'Bitmap.Save'가 저장되는 이미지의'PixelFormat'을 무시하는 이유는 무엇입니까? 또는 인덱스 된 픽셀 형식의'Graphics.FromImage'에 의해 던져진 예외를 어떻게 해결할 수 있습니까? –

+0

죄송합니다. 질문을 추가하지 않았습니다. 문제는 "Bitmap.Save가 Bitmap의 PixelFormat을 무시하는 이유"입니다. – ieaglle

+0

8 비트 색인을 원하면 GIF로 저장해야합니다. – leppie

답변

4

다음은 비트 맵을 1bpp/8bpp 비트 맵으로 변환하는 코드입니다.

changePixelFormat 메소드에서 변환해야 할 픽 셀 형식을 확인한 다음 1bpp 또는 8bpp 인 경우 링크의 코드를 사용하고 다른 모든 형식의 경우 코드를 사용하십시오.

이미지가 인덱싱 된 화소 형식으로되어있는 경우는,이 ​​방법은, "A 그래픽 객체 에서있는 이미지를 생성 할 수없는 메세지 예외 예외 :

Graphics.FromImagedocumentation 비고 갖는다 인덱스가 지정된 픽셀 형식입니다. " 인덱싱 된 픽셀 형식은 다음 목록에 표시된 입니다.

Format1bppIndexed

Format4bppIndexed

Format8bppIndexed

NEW 부 :

8bpp를 :

이 내가 짧은 인터넷 검색 후 발견 것입니다 그레이 스케일 이미지 및 8bpp jpg는 gdiplus 버전 1.0에서 지원되지 않습니다. 그레이 스케일 이미지와 향상된 코덱 지원을 지원하는 Windows 7의 새로운 gdiplus 버전이 있습니다.

8bpp 인덱싱 된 jpeg 이미지는 Microsoft의 WIC API로 지원됩니다.

Microsoft의 다운로드 사이트에서 WIC 탐색기를 다운로드하면 직접 시도 할 수 있습니다.

GDI+ 8 bit load/save bug

JPEG 표준은 24 비트의 이미지를 지원한다.

+0

코드가 bpp로 바뀌지 만 Bitmap.Save가 24bpp에 저장 중입니다. – ieaglle

+0

"새로운 부분"을 참조하십시오. – HABJAN

+0

어쩌면 저는 나쁜 googler이지만 이것에 관해서는 아무것도 찾을 수 없습니다. – ieaglle

5

나는 JPEG 이미지 포맷은 인덱스 이미지를 지원하지 않습니다 거의 확실 해요. 따라서 PixelFormat.Format8bppIndexed 지정하는 이미지를 만든 경우에도 GDI + JPEG로 저장하려고 할 때 다른 형식으로 변환하는 것입니다. 이 경우 이미 24 bpp로 결정했습니다.

대신, 당신은 BMP 나 GIF로 이미지를 저장해야합니다. 예를 들어 :

NewPicture.Save("hello.jpg", ImageFormat.Bmp); 

는 인덱스 색상 here on Wikipedia을 지원하는 이미지 파일 형식의 표를 참조하십시오.

0

진정한 8 비트 그레이 스케일 비트 맵 이미지를 찾고 있다면 detailed StackOverflow post을 만들었습니다. Windows 7뿐만 아니라 모든 운영 체제 (Windows/Mac/Linux)에서 작동합니다. 도움이되기를 바랍니다.

0

인덱스되지 않은 이미지에 Graphics 클래스를 사용하십시오. 인덱스 이미지를 처리 ​​할 때 비트 맵 및 비트 맵을 사용하십시오.

관련 문제