2009-05-21 25 views
7

Tôi đang có một thời gian với việc tạo hình thu nhỏ và sau đó chuyển đổi chúng thành một mảng byte. Tôi đã thử ba phương pháp, và tất cả 3 lần tôi nhận được một lỗi.Tạo một hình thu nhỏ và sau đó chuyển đổi thành mảng byte

đầu tiên được sử dụng Bitmap.GetThumbnailImage, mà tôi đã sử dụng trong quá khứ và sau đó được lưu trực tiếp vào Response.OutputStream

Thứ hai đã sử dụng System.Drawing.Graphics với drawImage(). Vẫn không đi.

Thứ ba chỉ là tạo bitmap mới, chuyển vào bitmap cũ và đặt kích thước mới. Lỗi tương tự.

Value cannot be null.
Parameter name: encoder

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ArgumentNullException: Value cannot be null.
Parameter name: encoder

Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:
[ArgumentNullException: Value cannot be null.
Parameter name: encoder]
System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams) +615244

Đây là mã cho phương pháp của tôi. Có lẽ ai đó sẽ thấy những gì tôi đang làm sai. Trong trường hợp bạn không chắc chắn về GetThumbSize, nó chỉ đơn giản là một phương pháp mà có kích thước hình ảnh và kích thước ngón tay cái tối đa và sau đó tính toán một kích thước thực tế để bảo tồn tỷ lệ khung hình.

public static System.Drawing.Image.GetThumbnailImageAbort thumbnailCallback = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback); 

    public static bool ThumbnailCallback() 
    { 
     return false; 
    } 

    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="image"></param> 
    /// <param name="size"></param> 
    /// <remarks> 
    /// This method will throw a AccessViolationException when the machine OS running the server code is windows 7. 
    /// </remarks> 
    /// <returns></returns> 
    public static byte[] CreateThumbnail(byte[] imageData, Size size) 
    { 
     using (MemoryStream inStream = new MemoryStream()) 
     { 
      inStream.Write(imageData, 0, imageData.Length); 

      using (System.Drawing.Image image = Bitmap.FromStream(inStream)) 
      { 
       Size thumbSize = GetThumbSize(new Size(image.Width, image.Height), size); 

       //do not make image bigger 
       if (thumbSize.Equals(image.Size) || (image.Width < size.Width || image.Height < size.Height)) 
       { 
        //if no shrinking is ocurring, return the original bytes 
        return imageData; 
       } 
       else 
       { 
        using (System.Drawing.Image thumb = image.GetThumbnailImage(thumbSize.Width, thumbSize.Height, thumbnailCallback, IntPtr.Zero)) 
        { 

         using (MemoryStream outStream = new MemoryStream()) 
         { 
          thumb.Save(outStream, thumb.RawFormat); 

          return outStream.ToArray(); 
         } 
        } 
       } 
      } 
     } 

    } 

Dòng này được ném lỗi:

thumb.Save(outStream, thumb.RawFormat); 

Bất kỳ ý tưởng? Cảm ơn đã giúp đỡ!

+1

Sự cố này trên Microsoft Connect: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=98452 –

Trả lời

6

Tôi nghĩ rằng sự cố có thể là mã hóa của hình ảnh gốc. IIRC, Lưu (luồng, định dạng) dẫn đến một cuộc gọi để Lưu (stream, encoder, params), với bộ mã hóa được lấy từ định dạng; trong trường hợp của bạn là định dạng gốc của hình ảnh.

Theo Nội dung cộng đồng cho Save method, một số định dạng sẽ không chuyển thành một bộ mã hóa thích hợp.

Tôi khuyên bạn nên chỉ định bộ mã hóa, sử dụng một số định dạng chuẩn như PNG.

Hãy thử:

thumb.Save(outStream, ImageFormat.Png, null); // optionally add encoder parameters here, like quality or luminescence 
+2

Đề xuất của bạn dẫn tôi thử một cái gì đó. Tôi vừa viết một phương thức để chuyển đổi ImageFormat thành một mimetype. Tôi chạy định dạng của hình ảnh gốc thông qua điều này và nó trả về "hình ảnh/gif", đó là như mong đợi vì phần mở rộng tập tin là .gif. Sau đó, tôi đã thay thế vi phạm như sau: thumb.Save (outStream, image.RawFormat); và hoạt động. Cảm ơn đã giúp đỡ. – Josh

1

Nếu những gì bạn đang cố gắng làm là lưu nó trong một định dạng Raw bạn có thể thử những điều sau đây, như trong trường hợp của tôi nó hoạt động khi các định dạng hình ảnh ban đầu là một hỗ trợ một:

try 
{ 
    thumb.Save(outStream, img.RawFormat); 
} 
catch (System.ArgumentNullException) 
{ 
    thumb.Save(outStream, ImageFormat.Png); 
} 
Các vấn đề liên quan