2011-02-16 5 views
0

비슷한 질문이 있지만 이진 열의 이미지 저장과 관련하여 질문이 있다는 것을 알고 있습니다.저장시 이진 열의 Jpeg 이미지를 다시 인코딩하는 중

Linq2SQL을 사용하여 SQL Compact Team의 그림 상자 컨트롤에 이미지를로드하는 작은 창 폼 앱이 있습니다. 사용자는 그림 상자에서 이미지 (jpg, bmp, gif)를 드래그 할 수 있습니다. DragDrop-Event에서 이미지가 그림 상자에로드됩니다. 나는 다음과 같은 코드가 PictureBox 컨트롤의 이미지를 저장하기 위해 실행되는 기록을 저장할 때 : 나는 바이트 배열의 크기를 확인하고 그 기록을 저장 한 후 변경하지 않은

MemoryStream imgStream = new MemoryStream(); 
pictureBox1.Image.Save(imgStream, System.Drawing.Imaging.ImageFormat.Jpeg); 
myTable.MyImage = imgStream.ToArray(); 

합니다. Save-Method가 호출 될 때마다 이미지가 다시 인코딩됩니까? 아마도 이미지가 전혀 변경되지 않았는지 확인하는 것이 좋습니다.

답변

0

JPEG 이미지는 .NET에서 표시되는 함수로 디코딩됩니다 (또는 실제로는 거의 모든 것). 따라서 JPEG을 바이너리로 가져 와서 PictureBox에 넣으면 (그러면 래스터 형식으로 변환되어 표시됩니다), 압축되지 않은 래스터 이미지를 가져 와서 다시 압축하면 결국 변경 될 수 있습니다 영상.

나는 이미지의 어딘가에 원래의 바이트 스트림을 유지하고 사용자가 데이터를 저장할 때이를 DB에 다시 씁니다. 이렇게하면 이미지의 무결성을 유지하는 데 도움이 될뿐만 아니라 매번 이미지를 다시 압축해야하는 필요성이 줄어들어 성능이 향상됩니다.

+0

덕분에 솔루션을 찾을 수있었습니다. 바이트 배열 (이전 이미지와 현재 인코딩 된 것)을 SequenceEqual과 비교합니다. '경우는 (myTable.MyImage == null이 는 || myTable.MyImage.ToArray() SequenceEqual는 (imgStream.ToArray())!.) 는 myTable.MyImage = imgStream.ToArray(); '는 – fnx

+0

내 마지막 코멘트가 있다고 가정 바이트 [] 압축 된 이미지 (저장시)는 db의 바이트 []와 동일합니다. 디버깅 할 때 이미지가 변경되지 않으면 바이트 []가 실제로 동일하다는 것을 알았습니다. 이미지를 항상 jpg로 저장했기 때문일 수 있습니까? – fnx

+0

JPEG 압축의 "손실"부분은 데이터가 실제로 압축되기 전에 발생하며 압축기는 데이터가 이미 압축 할 수있는 간단한 형식으로되어 있는지 파악할만큼 똑똑해야합니다 (SHOULD). 따라서 이미지를 단순화하기 위해 정보가 버려지는 초기 변환 이후에 기본적으로 얻는 것은 압축을 풀고 다시 압축하여 저장하는 ZIP 파일입니다. 이미지가 변경되지 않는 한이 작업을 무기한 수행 할 수 있습니다. – KeithS

0

Save를 호출 할 때이 코드가 호출되면 PictureBox는 매번 JPEG로 "내보내기"됩니다. 이 때문에 성능 문제가 발생 했습니까? 이를 피하려면 응용 프로그램로드시 플래그를 설정하고 끌어서 놓기 이벤트가 발생할 때 Save 메서드가 이미지 데이터를 업데이트해야 함을 알리는 플래그를 발생시킵니다.

+0

필자의 경우 성능은 문제가되지 않지만 레코드가 저장 될 때마다 품질 저하가 발생하지 않도록하고 싶습니다. – fnx

관련 문제