2011-09-23 66 views
8

Tôi có một trang gửi dữ liệu canvas html5, được mã hóa dưới dạng hình ảnh bmp base64 (sử dụng thuật toán http://devpro.it/code/216.html) này thành quy trình serverside chuyển đổi nó thành đối tượng System.Drawing.Image và một số thao tác trên đó.System.ArgumentException: Tham số không hợp lệ

Trong môi trường địa phương của tôi, điều này chỉ hoạt động tốt, nhưng trên dụ EC2 của tôi, tôi nhận được lỗi sau:

System.ArgumentException: Parameter is not valid. at System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement, Boolean validateImageData) at System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement)

Mã của tôi trông như sau:

System.Drawing.Image image = null; 
string b64string = "..."; 
byte[] sf = Convert.FromBase64String(b64string); 
using (MemoryStream s = new MemoryStream(sf, 0, sf.Length)) 
{ 
    image = System.Drawing.Image.FromStream(s, false); 
} 
... 

Dưới đây là một file văn bản với một mẫu b64string mà tôi đang sử dụng để kiểm tra: https://docs.google.com/leaf?id=0BzVLGmig1YZ3MTM0ODBiNjItNzk4Yi00MzI5LWI5ZWMtMzU1OThlNWEyMTU5&hl=en_US

Tôi cũng đã thử những điều sau đây và có cùng kết quả:

System.Drawing.ImageConverter converter = new System.Drawing.ImageConverter(); 
image = converter.ConvertFrom(sf) as System.Drawing.Image;   

Mọi thông tin chi tiết sẽ được đánh giá cao!

+0

Phiên bản nào của khung công tác mà bạn đang chạy trên, cục bộ và trên phiên bản ec2? – Oded

+0

Bạn có nghĩa là dữ liệu thử nghiệm thực tế (tệp đó) không thể được giải mã trên cá thể ec2, nhưng có thể trên máy tính của bạn không? Ví dụ. không có khả năng rằng có dữ liệu khác nhau được xử lý trong dev của bạn và trong thử nghiệm máy chủ của bạn. –

+0

Xin lỗi, quên đề cập đến .NET 4.0 trên cả hai. – ari

Trả lời

5

Tôi vẫn không biết nguyên nhân thực sự của vấn đề của bạn, nhưng tôi đoán nó có liên quan với định dạng hình ảnh mà lớp học Image không nhận ra. Sau khi kiểm tra dữ liệu nhị phân một chút, tôi có thể tạo hình ảnh của bạn. Tôi hi vọng cái này giúp được.

Bitmap GetBitmap(byte[] buf) 
{ 
    Int16 width = BitConverter.ToInt16(buf, 18); 
    Int16 height = BitConverter.ToInt16(buf, 22); 

    Bitmap bitmap = new Bitmap(width, height); 

    int imageSize = width * height * 4; 
    int headerSize = BitConverter.ToInt16(buf, 10); 

    System.Diagnostics.Debug.Assert(imageSize == buf.Length - headerSize); 

    int offset = headerSize; 
    for (int y = 0; y < height; y++) 
    { 
     for (int x = 0; x < width; x++) 
     { 
      bitmap.SetPixel(x, height - y - 1, Color.FromArgb(buf[offset + 3], buf[offset], buf[offset + 1], buf[offset + 2])); 
      offset += 4; 
     } 
    } 
    return bitmap; 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    using (FileStream f = File.OpenRead("base64.txt")) 
    { 
     byte[] buf = Convert.FromBase64String(new StreamReader(f).ReadToEnd()); 

     Bitmap bmp = GetBitmap(buf); 
     this.ClientSize = new Size(bmp.Width, bmp.Height); 
     this.BackgroundImage = bmp; 
    } 
} 
+0

Cảm ơn! điều này giúp tôi giải quyết tốt hơn. Kết quả đầu ra không thay đổi màu sắc mặc dù - R và B đổi chỗ? Bản gốc: http://i.imgur.com/a0UXf.gif Đầu ra: http://i.imgur.com/TVUmk.gif (lưu ý: nền đen có thể là do chuyển đổi dữ liệu canvas) – ari

+0

Làm bạn có một mã nguồn cho mã giải mã? – ari

+0

Nguồn? Không, tôi đã thực hiện nó. Tôi không biết hình ảnh gốc. Vì vậy, bạn phải chơi một chút với SetPixel như thế này 'bitmap.SetPixel (x, height - y - 1, Color.FromArgb (buf [offset + 3], buf [offset + 2], buf [offset + 1] , buf [offset])); 'Lưu ý: Tôi hoán đổi' buf [offset + 2] 'và' buf [offset] ' –

3

Mã đã đăng có vẻ chính xác. Tôi đã thử nghiệm nó và nó hoạt động tốt.

Ngoại lệ "System.ArgumentException: Tham số không hợp lệ". mà không có bất kỳ gợi ý nào khác (đặc biệt không phải là tên của tham số) là một trình bao bọc cho GDI + (lỗi công nghệ cơ bản đằng sau lớp .NET Image) tiêu chuẩn lỗi InvalidParameter, không cho biết chính xác tham số nào không hợp lệ.

Vì vậy, theo mã FromStream với .NET Reflector, chúng ta có thể thấy rằng các tham số được sử dụng trong các cuộc gọi GDI + về bản chất là ... luồng đầu vào.

Vì vậy, dự đoán của tôi là luồng đầu vào bạn cung cấp đôi khi không hợp lệ dưới dạng hình ảnh? Bạn nên lưu các luồng đầu vào không thành công (sử dụng File.SaveAllBytes (sf) chẳng hạn) để điều tra thêm.

+0

'Vì vậy, dự đoán của tôi là luồng đầu vào bạn cung cấp đôi khi không hợp lệ dưới dạng hình ảnh?' Bạn nghĩ gì về dữ liệu mẫu? Lớp hình ảnh không tải được nhưng tôi nghĩ nó đúng bằng cách nào đó. –

+0

@ L.B - Tôi có thể tải dữ liệu mẫu (liên kết do OP cung cấp) dưới dạng .BMP thành công. –

+0

Nhưng tôi không thể với XP-Home (32bit). Tôi gặp lỗi tương tự 'Tham số không hợp lệ' –

0

Điều này có thể xảy ra nếu sf chứa dữ liệu hình ảnh không hợp lệ. Xác minh tính hợp lệ của dữ liệu bạn đang chuyển vào luồng và xem liệu có khắc phục được sự cố của bạn hay không.

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