2015-01-15 8 views
1

저는 애니메이션 GIF가 base64 문자열 형식으로 포함 된 다음, 바이트 배열에로드 된 다음 메모리 스트림에 넣고 마지막으로 그림 상자에 넣는 앱을 작성하고 있습니다. 여기에 내가 지금까지 가지고있는 코드는 다음과 같습니다.C# 어떻게 Base64 문자열 형식의 애니메이션 GIF를 MemoryStream으로 가져온 다음 PictureBox로 가져 옵니까?

if (GameInfo.TitlePageImagePresent == true) 
{ 
    byte[] TitlePageImageBuffer = Convert.FromBase64String(GameInfo.TitlePageImage); 
    MemoryStream memTitlePageImageStream = new MemoryStream(TitlePageImageBuffer, 0, TitlePageImageBuffer.Length); 
    memTitlePageImageStream.Write(TitlePageImageBuffer, 0, TitlePageImageBuffer.Length); 
    memTitlePageImageStream.Position = 0; 
    pbGameImages.Image = Image.FromStream(memTitlePageImageStream, true); 
    memTitlePageImageStream.Close(); 
    memTitlePageImageStream = null; 
    TitlePageImageBuffer = null; 
} 

애니메이션 된 GIF의 한 프레임 만 그림 상자로 이동하는 것이 문제입니다. 전체 애니메이션을 얻으려면 애니메이션 GIF의 모든 개별 이미지를 처리해야하는 중간 과정이 있습니까?

+0

이것은 WinForms에 관한 것입니까? 그 특정 컨트롤이 GIF 애니메이션을 지원한다고 생각하지 않습니다. –

+1

이것은 Visual Studio 2013에서 만든 Windows Forms 응용 프로그램입니다. 움직이는 GIF를로드하려고하는 컨트롤은 움직이는 GIF를 지원하는 그림 상자입니다. 위의 코드에서 문제는 애니메이션 GIF의 한 프레임 만 전체 애니메이션이 아닌 그림 상자로 이동한다는 것입니다. – user2272380

+0

GameInfo.TitlePageImage가 GIF입니까? 해당 값을로드하는 방법을 보여주는 코드를 게시 할 수 있습니까? –

답변

0

방금 ​​다른 아이디어가 있습니다. 위의 코드 예제를 다음과 같이 생각하십시오.

바이트 [] TitlePageImageBuffer = Convert.FromBase64String (GameInfo.TitlePageImage);

일단 바이트 배열에 기본 64 문자열이 있으면 처음 4 바이트를 읽을 수 있습니다. 처음 네 개가 "GIF8"이면 GIF입니다. 다음으로 표준 GIF 이미지인지 또는 애니메이션 GIF인지 확인하려고합니다. 표준 GIF라면 그림 상자로 바로 보낼 수 있습니다. 애니메이션 GIF 인 경우 사진 상자에 넣기 전에 좀 더 작업해야합니다. 바이트 배열의 처음 네 개를 읽는 데 문제가 없어야하지만, 애니메이트 된 GIF를 재구성하여 애니메이션을 생성하는 방법을 아는 사람이 있습니까?

또한 다른 사람이 문제가 시작된 위치 인 것처럼 처음부터 이미지를 base64 문자열로 변환하는 과정을 시작한 방법을 묻습니다. 코드는 다음과 같습니다.

  if (pbTitlePageImage.Image != null) 
      { 
       // This is the step-by-step to convert an image to base64 string. 
       string Image2BConverted; 
       using (Bitmap bm = new Bitmap(pbTitlePageImage.Image)) 
       { 
        using (MemoryStream ms = new MemoryStream()) 
        { 
         BinaryWriter bw = new BinaryWriter(ms); 
         bm.Save(ms, ImageFormat.Gif); 
         Image2BConverted = Convert.ToBase64String(ms.ToArray()); 
         GameInfo.TitlePageImage = Image2BConverted; 
         bw.Close(); 
         ms.Close(); 
         GameInfo.TitlePageImagePresent = true; 
         ProjectNeedsSaving = true; 
        } 
       } 
      } 

이 방법을 사용하면 전반적인 프로세스를 더 잘 이해할 수있을뿐만 아니라 잘못된 작업을 찾을 수도 있습니다.