2013-07-24 2 views
0

gif 파일을 byte []로 변환하고 싶습니다.C#에서 gif 파일을 byte []로 변환하는 두 가지 방법

두 가지 방법을 시도했지만 결과가 다릅니다. 어느 것이 옳았습니까?

방법 1 :

bytes =File.ReadAllBytes(filepath) 사용함; 이것은 바이트 배열을 반환합니다.

Methond 2

private byte[] ImageToBytes(Image image, ImageFormat format) 
     { 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       image.Save(ms, format); 
       return ms.ToArray(); 
      } 
     } 

Bitmap image = new Bitmap(@"c:\\1.gif"); 

이어서

2 바이트 bytes = ImageToBytes(image, ImageFormat.Gif);


차이가 조금있는 부른다. 어느 쪽을 신뢰해야합니까?

답변

1

"methond 2"가 파일을 다시 인코딩/다시 압축하고 있습니다. 그것은 상당히 다를 가능성이 높으며 (모든면에서) 품질이 떨어집니다.

+0

'ImageFormat.Gif'가'ImageFormat.Bmp' 또는'ImageFormat.Png'으로 변경 되었다면 그것들을 기능적으로 동일하게 만들지 않겠습니까? –

+0

아니요. 디스크에서 바이트를 복사하는 것은 기본적으로 다른 이미지 형식간에 메모리를 변환하는 것과 다릅니다. 출처는 gif입니다. 물론'ImageFormat.Bmp' 나'ImageFormat.Png'은 다를 것입니다. – spender

+0

맞습니다. 물론, 파일의 나머지 부분이 아니라 픽셀 데이터에 대해서 생각하고있었습니다. BMP와 PNG는 일반적으로 무손실 형식이기 때문에 변환이 이루어지면 이미지 화질이 떨어지지 않아야합니다. 단 헤더 등이 완전히 다를 것입니다. 맞습니까? –

0

두 가지 모두 "옳다"는 것은 컴퓨터가 말한 결과입니다. 하나는 파일에서 직접 가져온 바이트 배열이고, 다른 하나는 파일을 디코딩하고 다시 인코딩 한 결과이며, 결국 똑같은 배열이되거나 매우 다를 수 있습니다. 당신이 원했던 것은 첫 번째 것이고, 이것은 디코딩/인코딩 과정을 거치지 않고 원본 데이터를 유지하기 때문에 훨씬 빠르기 때문입니다. 두 번째 것을 사용하는 것이 내가 생각할 수있는 유일한 이유는 무엇인가의 이유로 .NET GIF 인코딩 프로세스의 결과를 실제로 분석해야하는 경우입니다.

두 번째 옵션은 메모리에있는 모든 것을 수행하기 때문에 임시 파일을 필요로하지 않는다는 점을 제외하면 아래와 같습니다. 그래서 당신이하고있는 모든 일은 그것을 적재하고 그것을 저장하고 다시 적재하는 것입니다.

Bitmap image = new Bitmap(@"c:\1.gif"); 
image.Save("c:\1_temp.gif", ImageFormat.Gif); 
bytes = File.ReadAllBytes(@"c:\1_temp.gif"); 
관련 문제