2012-01-06 32 views
13

Tôi có một vấn đề nhỏ và tôi không tìm thấy bất kỳ giải pháp nào. Tôi muốn chuyển đổi GIF thành một byte [] và sau đó quay lại GIF. Tôi làm việc tốt nhưng tôi mất hoạt hình.C# gif Hình ảnh tới MemoryStream và ngược lại (mất hoạt ảnh)

Đó là GIF động hoàn hảo khi tôi bắt đầu (tôi hiển thị nó trong phần tử PictureBox). Nhưng sau khi chuyển đổi tôi gặp khó khăn với khung hình đầu tiên.

HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create("creativetechs.com/i/tip_images/ExampleAnimation.gif"); 
HttpWebResponse httpWebReponse = (HttpWebResponse)httpWebRequest.GetResponse(); 
Stream stream = httpWebReponse.GetResponseStream(); 
Image img = Image.FromStream(stream); 

MemoryStream ms = new MemoryStream(); 
img.Save(ms,img.RawFormat); 
byte [] bytes = ms.ToArray(); 
Image img2 = Image.FromStream(new MemoryStream(bytes)); 

int frames1 = img.GetFrameCount(System.Drawing.Imaging.FrameDimension.Time); 
int frames2 = img2.GetFrameCount(System.Drawing.Imaging.FrameDimension.Time); 

Tôi cũng đã cố gắng không sử dụng RawFormat nhưng System.Drawing.Imaging.ImageFormat.Gif. Không thay đổi gì cả. frames1 là số lượng khung hình phù hợp. frames2 là 1.

Tôi có 2 PictureBox yếu tố trong GUI của mình. Một hiển thị imgimg2 khác. Nhưng img2 không hoạt ảnh trong khi img là. Chuyện gì thế?

Tôi cũng đã cố gắng sử dụng serialization thay vì tạo byte của tôi [].

Tôi đã tuần tự hóa hình ảnh và deserialized nó một lần nữa và nó đã không thay đổi bất cứ điều gì cả. Sao có thể như thế được?

+3

Bộ mã hóa gif GDI + không hỗ trợ SaveAdd() cũng như các hình động. –

+0

Bạn có cho rằng đó có phải là vấn đề với GIF không? Tôi vừa thử mã chính xác của bạn với [GIF] này (http://www.creativetechs.com/iq/tip_images/ExampleAnimation.gif) và nó không hoạt động. Cả hai 'frame1' và' frames2' bằng 17. –

+0

Và tại sao tôi có thể tải và hình dung một gif động từ Web ResponseStream? –

Trả lời

9

Khi bạn tải hình ảnh của mình từ Stream, khuôn khổ .NET phát hiện GIF hoạt ảnh. Vì nó biết rằng nó sẽ không thể reencode một GIF động, nó cố gắng để lưu trữ các mã hóa ban đầu của GIF. Nhưng điều này xảy ra sau nó đã đọc luồng và giải mã GIF. Vì vậy, khi nó cố gắng để tua lại dòng này không thành công và nó kết thúc lên không lưu trữ bản gốc.

Khi bạn gọi Save() trước tiên nó sẽ kiểm tra xem nó có được mã hóa ban đầu được lưu trữ hay không. Nhưng kể từ khi hoạt động đó thất bại, nó cố gắng để mã hóa lại GIF. Vì .NET không có bộ mã hóa cho GIF động, nó chỉ mã hóa khung hình đầu tiên.

Nếu bạn sử dụng FileStream thay vào đó, nó hoạt động, vì có thể tìm kiếm được FileStream.

Bạn có thể làm cho công việc mã của bạn bằng cách tải các phản ứng vào một MemoryStream đầu tiên:

// ... 
Stream stream = httpWebReponse.GetResponseStream(); 

MemoryStream memoryStream = new MemoryStream(); 
stream.CopyTo(memoryStream); 
memoryStream.Position = 0; 
stream = memoryStream; 

Image img = Image.FromStream(stream); 
// ... 

Nếu bạn muốn xem những gì xảy ra, cho phép NET tham khảo nguồn gỡ lỗi và lưu ý những gì xảy ra trong Image.EnsureSave() . Bạn cũng sẽ lưu ý rằng việc triển khai hình ảnh đã sao chép Luồng vào một MemoryStream, để chúng có thể khắc phục sự cố bằng cách sử dụng thay vì Luồng gốc.

+0

wow :). cuối cùng là một phản ứng thực sự tốt. cảm ơn rất nhiều. –

+0

Rasmus: Giải pháp của bạn có bị ảnh hưởng bởi vấn đề này không? http://support.microsoft.com/kb/814675 "Ngoài ra, nếu luồng đã bị hủy trong suốt thời gian của đối tượng Bitmap, bạn không thể truy cập thành công hình ảnh dựa trên luồng". Đối tượng Bitmap không giữ tham chiếu đến luồng. Nếu luồng được xử lý, tham chiếu đến Bitmap sẽ thất bại. Bạn sẽ nhận được ngay với nó khi làm việc với bitmap thường xuyên, nhưng nếu bạn tạo một GIF động từ một dòng, tái vẽ GIF động sẽ thất bại trên một số hệ thống. – MindModel

2

GDI + không chứa bất kỳ GIF động nào bộ mã hóa (chỉ cần một bộ giải mã ). Vì vậy, img.Save của bạn sẽ thả hoạt ảnh. Nhưng bạn có thể thử điều này: http://www.codeproject.com/KB/GDI-plus/NGif.aspx

+0

Nó hoạt động hoàn hảo nếu bạn tải gif từ một tập tin nhưng không phải nếu bạn tải nó từ một phản ứng http. –

Các vấn đề liên quan