2012-01-31 31 views
14

Tôi đang cố lưu hình ảnh vào MemoryStream nhưng không thành công trong một số điều kiện nhất định.Image.Save crashing: {"Giá trị không thể rỗng. R n Tên tham số: encoder"}

Đây là mã:

Các mã sau thành công:

Image img = Bitmap.FromStream(fileStream); 
MemoryStream ms = new MemoryStream(); 
img.Save(ms, img.RawFormat); // This succeeds. 

Các mã sau thất bại:

Image img = Bitmap.FromStream(fileStream); 
Image thumb = img.GetThumbnailImage(thumbWidth, thumbHeight, null, System.IntPtr.Zero); 

MemoryStream ms = new MemoryStream(); 
thumb.Save(ms, thumb.RawFormat); // This fails. 

Chú ý rằng đoạn thứ hai là sử dụng một hình ảnh tạo bằng Image.GetThumbnailImage.

Sự khác biệt là gì? Có ai có bất kỳ ý tưởng tại sao nó không?

Trả lời

22

Tôi tin rằng vấn đề đã làm với phần này của GetThumbnailImage documentation:

Nếu Image chứa một hình ảnh thu nhỏ nhúng, phương pháp này lấy hình thu nhỏ nhúng và quy mô nó với kích thước yêu cầu. Nếu Image không chứa hình thu nhỏ được nhúng, phương pháp này sẽ tạo hình thu nhỏ bằng cách chia tỷ lệ hình ảnh chính.

Điều này có thể giải thích cho hành vi không liên tục (AKA "các điều kiện nhất định"). Giải thích nằm trong các trường hợp sau đây Microsoft Connect ticket:

API cơ bản không thể định vị bộ mã hóa cho loại hình MemoryBmp. Chúng tôi sẽ cần phải điều tra điều này sẽ nhóm GDI +. Trong thời gian chờ đợi, bạn có thể thay đổi ImageFormat thành ImageFormat.Bmp thay vì ImageFormat.MemoryBmp và nó sẽ hoạt động. Nó sẽ vẫn được lưu vào MemoryStream bằng cách sử dụng định dạng BMP.

Trong mọi trường hợp, nếu không có thumbnail nhúng, hình thu nhỏ mới được tạo ra bởi GetThumbnailImage API là trong thực tế sẽ có một RawFormat của MemoryBmp mà không có encoder gắn liền - do đó được thông báo lỗi cụ thể mà bạn đang nhìn thấy .

Chỉ cần không sử dụng thumb.RawFormat; vì bạn biết đó là bitmap, thay vào đó hãy sử dụng ImageFormat.Bmp.

P.S. Xin lưu ý rằng mặc dù tôi đã xóa câu trả lời trước đó của tôi vì nó hóa ra là không liên quan đến vấn đề cụ thể này, điều quan trọng là sử dụng API GetThumbnailImage đúng như tài liệu chỉ định; bạn phải chuyển một đại biểu hợp lệ cho thông số callback thay vì null, nếu không nó có thể không thành công và bạn vẫn cần phải đóng gói hàng theo các mệnh đề using.

+1

thay đổi 'thumb.Save (ms, thumb.RawFormat)' thành 'thumb.Save (ms, thumb.Bmp)' đã làm! – agarcian

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