2010-04-08 8 views
3

두 가지 방법이 있습니다. 하나는 이미지를 Base64 문자열로 변환하여 XML 태그에 저장할 수 있고 다른 하나는 Base64 문자열을 영상. 이미지를 문자열로 변환하고 XML에 저장할 수 있지만 문자열을 이미지로 변환하려고하면 다음 오류가 발생합니다. "GZip 헤더의 매직 번호가 올바르지 않습니다. GZip 스트림을 전달하고 있는지 확인하십시오. "오류 : GZip 헤더의 마법 번호가 올바르지 않음

해결 방법에 대한 의견이 있으십니까?

public static string ConvertToBase64String(Image Image, ImageFormat Format) 
{ 
    MemoryStream stream = new MemoryStream(); 
    Image.Save(stream, Format); 

    byte[] imageBytes = stream.ToArray(); 

    MemoryStream memStream = new MemoryStream(); 
    GZipStream zipStream = new GZipStream(memStream, CompressionMode.Compress); 
    zipStream.Write(imageBytes, 0, imageBytes.Length); 

    string imageString = Convert.ToBase64String(imageBytes); 

    stream.Close(); 
    memStream.Close(); 

    return imageString; 
} 

public static Image Base64StringToImage(string ImageArray) 
{ 
    byte[] base64String = Convert.FromBase64String(ImageArray); 

    MemoryStream memStream = new MemoryStream(base64String); 
    GZipStream zipStream = new GZipStream(memStream, CompressionMode.Decompress); 
    zipStream.Read(base64String, 0, base64String.Length); 

    ImageConverter ic = new ImageConverter(); 
    Image image = (Image)ic.ConvertFrom(base64String); 

    memStream.Close(); 

    return image; 
} 

답변

6

코드에 몇 가지 오류가 있습니다.

오류 메시지의 원인은 기본 64 문자열로 변환하지 않는 것이 압축 된 데이터 (memStream.ToArray())가 아니라 우편 스트림 (imageBytes)에 기록한 데이터입니다. 압축되지 않은 데이터의 압축을 풀려고하면 오류 메시지가 나타납니다.

또 다른 주요 문제점은 zip 스트림에서 읽는 정도에 대한 크기로 압축 데이터의 크기를 사용하기 때문에 zip 스트림에서 데이터의 일부만 읽는 것입니다.

또한 Read 메서드의 결과를 무시합니다. 배열에 실제로 배치 된 바이트 수를 반환하며 요청 된 바이트 수보다 작을 수 있습니다. Read 메서드는 사용 가능한 모든 데이터를 반환 할 필요가 없으므로 실제로 스트림에서 모든 데이터를 가져올 때까지 루프를 실행해야합니다. Read 메서드는 읽을 데이터가 더 이상 없을 때 0을 반환합니다.

또 다른 문제점은 읽고있는 메모리 스트림에 대해 백 엔드로 사용중인 배열에 쓰는 것입니다. 압축 해제 된 데이터는 일반적으로 압축 된 데이터보다 크기 때문에 읽을 수있는 속도보다 빠르게 데이터를 덮어 쓰게됩니다. 그러나 압축을 푼 데이터는 배열에 맞지 않으므로 어쨌든 사용할 수 없습니다.

+0

압축되지 않은 데이터의 크기를 어떻게 알 수 있습니까? 압축 해제에 적합한 것으로 생각되는 임의의 크기의 바이트를 생성해야합니까? 숫자가 꽤 ​​클 수 있도록 이미지를 다루고 있습니다. – Icono123

+1

@ Icono123 : GZipStream에 크기를 요청할 수 있는지 확인하십시오. 그렇지 않으면 유일한 옵션은 데이터와 함께 원래 크기를 저장하는 것입니다. 그렇게 할 수 없다면 스트림을 읽을 때 더 많은 데이터를 할당해야합니다. MemoryStream을 사용하여이를 수행 할 수 있습니다. – Guffa