2010-11-18 28 views
7

Tôi đã triển khai chức năng sau kết nối với webservice và tải một favicon từ một trang web nhất định và lưu nó vào byte [] mà tôi lưu trữ trong cơ sở dữ liệu. Bây giờ tôi muốn thiết lập nó để nó lưu biểu tượng vào đĩa. Tuy nhiên tôi nhận được một "tham số không hợp lệ" khi tôi cố gắng và tạo ra hình ảnh từ byte [].Tạo và lưu hình ảnh từ byte [] khiến Thông số không phải là ngoại lệ hợp lệ

Mã của tôi là như sau ..

stream.Write(imageByteArray, 0, imageByteArray.Length); 
Image i = Image.FromStream(stream); // EXCEPTION HAPPENS HERE. 
i.Save(@"C:\tmp\" + filename + ".ico"); 

Trường hợp ngoại lệ xảy ra trên dòng trung lưu.

Mã này hoạt động hoàn hảo 9 lần trong số mười, nhưng đối với một số favicon, thậm chí nghĩ biểu tượng là một hình ảnh hợp lệ (hoặc ít nhất nó xuất hiện và nó hiển thị trong trình duyệt khi trỏ vào nó). .

Có ai có ý tưởng nào không? Tôi kéo tóc ra đây!

Cảm ơn

Dave

Edit: Các giá trị trong mảng mà dường như ném lỗi là 127.

+0

Bạn đang thu thập các tệp 'favicon' này như thế nào? Bạn có chắc tệp luôn luôn tồn tại không? Bạn có kiểm tra 'imageByteArray.Length == 0' không? – Oded

+0

Có, tôi chắc chắn rằng mảng không phải là số không và khi tôi lưu biểu tượng này vào Db nó hoạt động tốt. – Dave

Trả lời

20

Không cần đặt nó vào một hình ảnh, chỉ cần nhổ các byte thẳng ra:

var fs = new BinaryWriter(new FileStream(@"C:\\tmp\\" + filename + ".ico", FileMode.Append, FileAccess.Write)); 
fs.Write(imageByteArray); 
fs.Close(); 
+0

Hoàn hảo, tôi thực sự đã dành quá nhiều thời gian suy nghĩ trong hộp. – Dave

+1

Tốt hơn là sử dụng câu lệnh 'using' thay vì mở và đóng luồng theo cách thủ công. – SepehrM

+0

Câu trả lời hoàn hảo !! – Rahnzo

0

Thêm định dạng hình ảnh:

stream.Position = 0; 
i.Save(@"C:\tmp\" + filename + ".ico", System.Drawing.Imaging.ImageFormat.Icon); 
+0

Trường hợp ngoại lệ ném dòng trước đó, từ dòng Image.FromStream (luồng); Dường như giá trị trong mảng byte có chứa 127 – Dave

+0

Tôi đã cập nhật. Nó là vị trí của dòng. – Aliostad

+0

Xin lỗi đã thử điều này quá và nó không có sự khác biệt. Một lần nữa, điều này dường như chỉ xảy ra đối với một số trang web. Cảm ơn đã giúp đỡ! – Dave

1

Tôi biết bạn có câu trả lời bạn cần nhưng tôi chỉ muốn tiếp tục ý tưởng ban đầu của bạn. Tôi nghĩ vấn đề là mảng byte của bạn bằng cách nào đó đã được thay đổi và trở thành byte char mảng, bạn chỉ cần thêm đoạn mã này để làm cho nó trở thành byte mảng một lần nữa:

for (int i=0;i<imageByteArray.Length;i++) 
{ 
    imageByteArray[i]=(byte) imageByteArray[i]; 
} 

Tôi có vấn đề này và giải quyết nó bằng giải pháp này . Chúc may mắn!

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