2013-11-23 4 views
3

winform C# 데스크톱 응용 프로그램이 있습니다.보존 화질

계속 입력되는 jpeg가 있습니다. 현재 이미지를 이전 1과 비교하고 있습니다. 타사 도구 인 Emgu를 사용하여 차이점 만있는 새 이미지를 만들 수 있습니다.

그런 다음 이미지를 메모리 스트림으로 변환 한 다음 바이트 배열로 변환합니다.

수신 응용 프로그램에서이 바이트 배열을 가져 와서이 바이트를 사용하여 메모리 스트림을 통해 이미지를로드합니다.

문제는 이미지가 상당히 많이 저하된다는 것입니다.

이미지를 클라이언트 측의 메모리 스트림으로 변환하기 전에 하드 드라이브에 저장하면 이미지 품질이 좋습니다.

문제는 메모리 스트림으로로드 할 때 발생합니다.

jpeg로 인코딩합니다.
서버로 보내기 전에 PNG로 인코딩하면 품질이 좋습니다. 바이트 배열에서 크기를 PNG로 인코딩하는 데 문제가 발생합니다.

내 의도는 응답 시간을 향상시키기 위해 업로드해야하는 바이트 수를 줄이는 것이 었습니다.

내가 잘못했거나하지 않을 수 있습니까? 내가 대신 이렇게하면

Bitmap imgContainingDifference 
    = GetDiffFromEmgu(CurrentJpegImage, PreviousJpegImage); 

using (System.IO.MemoryStream msIn = new System.IO.MemoryStream()) 
{ 
    holding.Save(msIn, System.Drawing.Imaging.ImageFormat.Jpeg); 
    data = msIn.ToArray(); 
} 

//test here 
using (System.IO.MemoryStream msOut = new System.IO.MemoryStream(_data)) 
{ 
    Bitmap testIMG = (Bitmap)Image.FromStream(msOut); 
} 

//result is image is poor/degrades 

:

enter image description here

:

using (System.IO.MemoryStream msIn = new System.IO.MemoryStream()) 
{ 
    holding.Save(msIn, System.Drawing.Imaging.ImageFormat.Png); 
    data = msIn.ToArray(); 
} 

using (System.IO.MemoryStream msOut = new System.IO.MemoryStream(_data)) 
{ 
    Bitmap testIMG = (Bitmap)Image.FromStream(msOut); 
} 

//Image is good BUT the size of the byte array is 
//10 times the size of the CurrentFrame right at the start. 

이 이미지에서 아이 제안을 사용할 때 모습입니다

내 코드입니다

@Ma의 친절한 제안에서 인코더를 사용해 보았습니다. gnatLU와 FreeImage.Net을 사용하면 같은 품질의 이미지를 얻을 수 있습니다.

+1

당신은 당신의 케이크를 가지고 그것을 먹기를 요구하고 있습니다. Jpeg와 같은 손실 압축을 사용하면 이미지 품질이 떨어집니다. PNG와 같은 무손실 압축을 사용하면 이미지 품질은 일정하게 유지되지만 크기는 증가 할 것으로 예상됩니다. 당신은 두 가지 방법 모두 가질 수 없습니다. – Rotem

+0

안녕하세요. 의견에 감사드립니다. 원래 이미지는 jpeg입니다. 두 이미지의 차이점 만 비교하고 다시 같은 형식 (jpeg)으로 저장 한 다음 현재 프레임을 JPEG로 재구성하고 픽셀 변경을 지나치게 적용합니다. jpeg가 아닌 다른 곳에서는 로딩, 비교 및 ​​저장 작업을 수행하지 않습니다. PNG 형식의 메모리 스트림에 변경 사항을 저장할 때 품질이 괜찮은 것이 관찰되었습니다. 내가 지금 생각할 수있는 것은 비교를하는이 타사 도구가 실제로 이미지를 PNG로로드하는 것입니다. –

+1

초기 이미지가 Jpeg보다 중요하지 않습니다. 포토샵에서 jpeg를로드하고 jpeg로 다시 저장하면 결과가 원본보다 낮아집니다. 압축을 반복 할 때마다 xerox의 xerox를 만든 것처럼 품질이 더 떨어집니다. – Rotem

답변

4

파일 크기를 인코딩 할 때 JPEG compression level을 설정하면 품질과 크기 간의 경험적 절충안이 가장 좋습니다.

+0

안녕하세요, 답장을 보내 주셔서 감사 드리며 품질이 향상되었지만 불행히도 사용하기에는 너무 가난했습니다. –