2009-06-15 2 views
1

나는 소수 픽셀 데이터 (16 비트 회색조 값)의 배열을 가지고 있으며 jpeg 이미지로 저장하려고합니다. 그러나 내 코드 "GDI +에서 일반 오류가 발생했습니다"저장 명령을 충돌하는 것입니다. 이 문제를 해결하는 방법을 알 수 없습니다. 내가 저장하고있는 디렉토리는 내 응용 프로그램에 의해 만들어지며 다른 파일을이 디렉토리에 씁니다. 그래서 나는 권한 문제가 아니라는 것을 안다. 어쩌면 데이터 손상 문제일까요? Bitmap 객체에 ushort 데이터를 가져 오는 단계에서 뭔가 잘못하고 있습니까? 내가 ushort 데이터를 가지고 있기 때문에 Bitmap 객체로 가져 오는 방법을 파악하는 데 약간의 노력이 필요하다는 것을 알았습니다.Bitmap 개체를 jpeg로 저장할 때 "일반 오류가 GDI +에서 발생했습니다"C#

Bitmap img = new Bitmap(width, height, PixelFormat.Format16bppGrayScale); 
Rectangle rect = new Rectangle(0,0, width, height); 
BitmapData picData = img.LockBits(rect, ImageLockMode.ReadWrite, img.PixelFormat); 
IntPtr pixelStartAddress = picData.Scan0; 

WriteableBitmap pic = new WriteableBitmap(width, height, 96.0, 96.0, System.Windows.Media.PixelFormats.Gray16, null); 

int stride = (thumb.XSize * pic.Format.BitsPerPixel + 7)/8; 
pic.WritePixels(new System.Windows.Int32Rect(0, 0, width, height), dataArray, stride, 0); 

pic.CopyPixels(new System.Windows.Int32Rect(0,0,thumb.XSize, thumb.YSize),pixelStartAddress, dataArray.Length * sizeof(ushort), stride); 

img.UnlockBits(picData); 
img.Save(path, ImageFormat.Jpeg); 

것은이 모든 일이 매우 실망되었다 :

여기 내 코드입니다. 도와주세요?!

+0

별도의 스레드에서 실행하고 있습니까? – jjxtra

+0

그래, 나는이 스레드를 별도의 스레드에서 실행한다. 그게 문제라고 생각하니? –

답변

3

저는 회색 음영/JPG와 관련이 있습니다. JPEG가 그레이 스케일을 지원하는지 모르겠습니다.

비트 맵을 일반 색상으로 선언 해 봅니다. 그리고 테스트.

+0

그게 문제 인 것 같습니다. PixelFormat을 일부 색상 형식으로 변경하면 충돌이 발생하지 않습니다. 그러나 결과 JPEG 이미지는 색상이 아니며 세부 정보가 손실됩니다. –

+0

"is not color"is not "is not"입니다. –

+2

Jpeg는 8 비트 그레이 스케일을 지원합니다. – Brian

0

나는 이것이 사용 권한 문제라고 확신합니다. GDI +는 기본 구성 요소이며 일반 파일 저장이나 이와 비슷한 사용 권한이 필요하다고 생각합니다. 이 ASP.NET 응용 프로그램입니까? 그렇다면 해당 폴더에 대한 IIS 프로세스에 대한 사용 권한을 부여해야합니다.

0

저장하려는 크기가 유효하지 않은 경우에 이런 현상이 발생했습니다. 너비가 0과 같습니다.

1

내가 그렸던 비트 맵은 어느 방법으로도 JPEG로 저장되는 경우가 종종 있습니다 (예외는 있음). 어떤 도움이 것은 첫 번째 이미지를 복제하는 것이 었습니다 :

img.Clone(); // or: 
img.Clone(rectangle, img.PixelFormat); 

어쩌면이 일을하여도 나는 또한 가정하기 때문에 그레이 스케일에 문제가 수 있다는 것을, 단지 tekBlues처럼, 픽셀 포맷을 변경하려고 할 수 있습니다. 이미지 품질에 대한 의견에 대해서는

1

(I는 주석으로 반응 한 것,하지만 코드 서식 손실) :

당신은 JPEG 수출에 대한 기본 설정으로 저장됩니다. 당신은 높은 품질의 설정으로 자신의 EncoderParameters 인스턴스를 만들 수 있습니다

var encParams = new EncoderParameters(1); 
var encParams.Param[0] = new EncoderParameter(Encoder.Quality, 91L); 
// get jpegEncoder by looping through ImageCodecInfo.GetImageEncoders()) 
image.Save("path to file", jpegEncoder, encParams); 
+1

16 비트 그레이 스케일 값이 다른 것으로 사용되기 때문에 품질이 손실됩니다. 따라서 16 비트는 하나의 값으로 사용되지 않고 3 개의 값으로 사용됩니다. –

1

불행하게도, GDI +가 제대로 PixelFormat.Format16bppGrayScale를 지원하지 않습니다. 나는이 오랜 문제를 연구 해왔고 해결책을 찾지 못했습니다.

현대적인 접근 방식은 System.Windows.Media에 최신 WPF API를 사용하는 것 같습니다.

관련 문제