2009-03-24 39 views
8

Tôi đang chụp ảnh từ máy ảnh thông minh và nhận mảng byte từ máy ảnh thông qua lập trình socket (ứng dụng .NET là máy khách, máy ảnh là máy chủ).Phương pháp Image.FromStream() trả về ngoại lệ đối số không hợp lệ

Vấn đề là tôi nhận được ngoại lệ System.InvalidArgument khi chạy.

private Image byteArrayToImage(byte[] byteArray) 
{ 
    if(byteArray != null) 
    { 
     MemoryStream ms = new MemoryStream(byteArray); 
     return Image.FromStream(ms, false, false); 
     /*last argument is supposed to turn Image data validation off*/ 
    } 
    return null; 
} 

Tôi đã tìm kiếm sự cố này trong nhiều diễn đàn và đã thử các đề xuất do nhiều chuyên gia đưa ra nhưng không có gì hữu ích.

Tôi không nghĩ rằng có bất kỳ vấn đề với mảng byte như vậy vì khi tôi nạp cùng một mảng byte vào ứng dụng khách VC++ MFC của tôi, tôi nhận được hình ảnh. Nhưng điều này không bằng cách nào đó làm việc trong C# .NET.

Có ai có thể giúp tôi không?

PS:

phương pháp

khác tôi đã cố gắng để hoàn thành nhiệm vụ tương tự là:

1.

private Image byteArrayToImage(byte[] byteArray) 
{ 
    if(byteArray != null) 
    { 
     MemoryStream ms = new MemoryStream(); 
     ms.Write(byteArray, 0, byteArray.Length); 
     ms.Position = 0; 
     return Image.FromStream(ms, false, false); 
    } 
    return null; 
} 

2.

private Image byteArrayToImage(byte[] byteArray) 
{ 
    if(byteArray != null) 
    { 
     TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap)); 
     Bitmap b = (Bitmap)tc.ConvertFrom(byteArray); 
     return b; 
    } 
    return null; 
} 

Không ai trong số các phương pháp trên đã làm việc. Giúp đỡ một cách tử tế.

+0

gì sẽ xảy ra nếu bạn chỉ đơn giản là viết bytearray vào một tập tin trên đĩa? Tệp có thể mở với một cái gì đó như photoshop không? – Chris

+1

bạn đã giải quyết chưa? Tôi có cùng một vấn đề – robob

Trả lời

1

System.InvalidArgument có nghĩa là luồng không có định dạng hình ảnh hợp lệ, tức là loại hình ảnh không được hỗ trợ.

+1

Xin chào, Cảm ơn bạn đã trả lời. Nhưng làm thế nào đến cùng một mảng byte hoạt động trong ứng dụng VC++ MFC của tôi? Cũng có cách nào tôi có thể kiểm tra tính hợp lệ của dữ liệu hình ảnh mảng byte của tôi không? Arvind K –

0

Tôi đã có cùng một vấn đề trong quá khứ và nó đã được gây ra bởi một rò rỉ trong các cửa sổ thư viện GDI, đó là những gì 'Bitmap' sử dụng. Nếu điều này xảy ra tất cả thời gian cho bạn thì nó có lẽ không liên quan, tuy nhiên.

+0

Xin chào Chris, Cảm ơn bạn đã trả lời. Điều đó xảy ra với tôi mỗi khi tôi chạy mã. –

3

Tôi đoán rằng có sự cố xảy ra khi nhận tệp từ máy chủ. Có lẽ bạn chỉ nhận được một phần của tập tin trước khi cố gắng chuyển đổi nó thành một số Image? Bạn có phải là chắc chắn đó là mảng byte chính xác mà bạn đang cung cấp ứng dụng C++?

Hãy thử lưu luồng vào tệp và xem những gì bạn nhận được. Bạn có thể khám phá một số manh mối ở đó.

Bạn cũng có thể thêm điểm ngắt và so sánh thủ công một số byte trong mảng byte với những gì chúng được cho là (nếu bạn biết điều đó).


Chỉnh sửa: Có vẻ như không có gì sai khi nhận dữ liệu. Vấn đề là ở định dạng thô (không phải định dạng Image.FromStream hiểu). Bạn có thể sử dụng Bitmap(Int32, Int32, Int32, PixelFormat, IntPtr) constructor tại đây. Hoặc, bạn có thể tạo bitmap trống và điền nó theo cách thủ công từ dữ liệu thô.

+0

Xin chào, Tôi đã thử lưu hình ảnh vào tệp jpg, bmp nhưng tôi không nhận được hình ảnh trong tệp. Điều khó hiểu là nó có cùng mảng byte mà tôi có thể hiển thị hình ảnh trong ứng dụng VC++ MFC của mình. –

+0

Đó là lý do tại sao tôi không chắc chắn đó là cùng một mảng byte. Kích thước tệp có giống nhau không? –

+0

Ứng dụng VC++ hiển thị hình ảnh trực tiếp từ máy ảnh và do đó những gì tôi đã làm là ghi mảng byte vào một tệp txt. Tương tự như vậy, từ NET của tôi appln tôi đã viết mảng byte vào một tập tin nad sau đó so sánh hai tập tin. Tôi thấy rằng tất cả các giá trị được lấp đầy và chúng ít nhiều giống nhau. –

3

Tôi đã có vấn đề này khi làm điều này:

MemoryStream stream = new MemoryStream(); 
screenshot.Save(stream, ImageFormat.Png); 
byte[] bytes = new byte[stream.Length]; 
stream.Save(bytes, 0, steam.Length); 

Với 2 dòng cuối cùng là vấn đề.Tôi cố định nó bằng cách làm này:

MemoryStream stream = new MemoryStream(); 
screenshot.Save(stream, ImageFormat.Png); 
byte[] bytes = stream.ToArray(); 

Và sau đó làm việc này:

MemoryStream stream = new MemoryStream(bytes); 
var newImage = System.Drawing.Image.FromStream(stream); 
stream.Dispose(); 
4

Có lẽ hình ảnh được nhúng trong một trường OLE và bạn phải xem xét các tiêu đề OLE 88 byte cộng với tải trọng:

byteBlobData = (Byte[]) reader.GetValue(0); 
stream = new MemoryStream(byteBlobData, 88, byteBlobData.Length - 88); 
img = Image.FromStream(stream); 
+0

Trong trường hợp của tôi, tôi chỉ phải "loại bỏ" 8 byte. MemoryStream mới (byteBlobData, 8, byteBlobData.Length - 8); – iwhp

+3

Làm sao bạn biết nó dài 8 bit? – C4u

7

Image.FromStream() dự kiến ​​luồng chỉ chứa một hình ảnh!

Nó reset stream.Position để 0. Tôi đã bạn đã một dòng có chứa nhiều hình ảnh hoặc các công cụ khác, bạn phải đọc dữ liệu hình ảnh của bạn thành một mảng byte và để khởi tạo một MemoryStream với điều đó:

Image.FromStream(new MemoryStream(myImageByteArray));

các MemoryStream phải vẫn mở miễn là hình ảnh được sử dụng.

Tôi đã lerned rằng cách cứng quá. :)

0

mã này đang làm việc

 string query="SELECT * from gym_member where Registration_No ='" + textBox9.Text + "'"; 

     command = new SqlCommand(query,con); 
     ad = new SqlDataAdapter(command); 
     DataTable dt = new DataTable(); 
     ad.Fill(dt); 
     textBox1.Text = dt.Rows[0][1].ToString(); 
     textBox2.Text = dt.Rows[0][2].ToString(); 
     byte[] img = (byte[])dt.Rows[0][18]; 
     MemoryStream ms = new MemoryStream(img); 

     pictureBox1.Image = Image.FromStream(ms); 
     ms.Dispose(); 
1

Hãy thử điều này:

public Image byteArrayToImage(byte[] item) 
{   
    Image img=Image.FromStream(new MemoryStream(item)); 
    img.Save(Response.OutputStream, ImageFormat.Gif); 
    return img; 
} 

Hy vọng nó sẽ giúp!

0

Hãy thử sử dụng một cái gì đó tương tự như những gì được mô tả ở đây https://social.msdn.microsoft.com/Forums/vstudio/en-US/de9ee1c9-16d3-4422-a99f-e863041e4c1d/reading-raw-rgba-data-into-a-bitmap

Image ImageFromRawBgraArray(
    byte[] arr, 
    int charWidth, int charHeight, 
    int widthInChars, 
    PixelFormat pixelFormat) 
{ 
    var output = new Bitmap(width, height, pixelFormat); 
    var rect = new Rectangle(0, 0, width, height); 
    var bmpData = output.LockBits(rect, ImageLockMode.ReadWrite, output.PixelFormat); 

    // Row-by-row copy 
    var arrRowLength = width * Image.GetPixelFormatSize(output.PixelFormat)/8; 
    var ptr = bmpData.Scan0; 
    for (var i = 0; i < height; i++) 
    { 
     Marshal.Copy(arr, i * arrRowLength, ptr, arrRowLength); 
     ptr += bmpData.Stride; 
    } 

    output.UnlockBits(bmpData); 
    return output; 
} 
Các vấn đề liên quan