2012-01-06 46 views
17

Tôi muốn có thể chuyển đổi từ Byte [] sang Hình ảnh và ngược lại.Cách so sánh hai hình ảnh sử dụng mảng byte

Tôi đã hai phương pháp này từ here:

public byte[] imageToByteArray(System.Drawing.Image imageIn) 
{ 
    MemoryStream ms = new MemoryStream(); 
    imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif); 
    return ms.ToArray(); 
} 

public Image byteArrayToImage(byte[] byteArrayIn) 
{ 
    MemoryStream ms = new MemoryStream(byteArrayIn); 
    Image returnImage = Image.FromStream(ms); 
    return returnImage; 
} 

Họ dường như làm việc, nhưng nếu tôi làm:

byte[] pic = GetImageFromDb(); 
bool result = pic == imageToByteArray(byteArrayToImage(pic)); 

tôi nhận được result = false!

Bất kỳ cách nào để sửa phương pháp này hoặc một số chức năng khác nhau để đạt được mục tiêu của tôi?

Cảm ơn!

+0

cùng một vấn đề ở đây: http://stackoverflow.com/questions/8763630/c-sharp-gif-image-to-memorystream-and-back-lose-animation trừ == thứ sử dụng pic. bằng (imageToByteArray (byteArrayToImage (pic)); –

+0

@OliverBernhardt thử mã này 'new byte [] {1} .Equals (new byte [] {1})' –

Trả lời

15

Sử dụng == sẽ so sánh các tham chiếu đối tượng nếu không ghi đè.

Vì đây là hai đối tượng khác nhaubyte[], các tham chiếu khác nhau.

Bạn cần so sánh mục byte[] đối tượng theo mục để xác nhận rằng chúng giống nhau. Bạn có thể sử dụng SequenceEquals trong trường hợp này.

+0

Ngoài ra, OP nên đọc một cái gì đó như http: // stackoverflow .com/questions/649444/testing-equality-of-arrays-in-c-sharp để có được một ý tưởng về cách so sánh chúng một cách chính xác. –

+0

Làm thế nào ngu ngốc! – Diego

+2

@ChrisShain - Câu hỏi đặt ra là có cùng một mục trong các mảng khác nhau - thứ tự không quan trọng ở đó. Nó là _very_ quan trọng ở đây. – Oded

2

== có nghĩa là bạn có tham chiếu đến cùng một đối tượng trong bộ nhớ.

This cho biết cách so sánh các mảng byte theo một vài cách khác nhau.

+0

thì tại sao điều này trả về false? 'new byte [] {1} .Equals (byte mới [] {1})' –

+0

@ L.B: rất đúng. Tha thứ cho tôi; cho mảng, điều này không hoạt động. Xem [ở đây] (http://stackoverflow.com/questions/43289/comparing-two-byte-arrays-in-net) để biết cách so sánh các mảng byte đúng cách. Cập nhật câu trả lời của tôi cho phù hợp. –

1

Khi bạn mã hóa lại hình ảnh, tệp kết quả (hoặc mảng byte) có thể khác (hơi?) Khác với phiên bản gốc. Đặc biệt nếu những gì bạn lấy từ cơ sở dữ liệu là một tập tin jpeg!

Vì vậy, ngay cả khi bạn so sánh các byte trong mảng (thay vì tham chiếu), bạn có thể nhận được sự khác biệt.

EDIT
Khi bạn đọc một byte [] (có chứa một GIF hình ảnh mã hóa) vào một BitMap, những byte được giải nén thành 4 (ARGB) byte cho mỗi pixel. Khi bạn lưu Bitmap đó vào một tệp gif (mới) (hoặc byte []), tệp mới được mã hóa có thể khác nhau (ví dụ: thứ tự các màu được lưu trữ). Vì vậy, không có gì đảm bảo rằng tệp mới (hoặc byte []) giống với tệp cũ, mặc dù bản thân hình ảnh không bị thay đổi.

+0

Tại sao điều đó lại ?? Có cách nào để tránh nó không? – Diego

+0

@Diego - xem chỉnh sửa –

2

Gần đây, tôi cần phải viết một trình cắt hình ảnh cần để lưu tệp tinBytes dưới dạng hình ảnh. đây là những gì tôi đã làm. Hy vọng rằng điều này sẽ giúp bạn.

public Image byteArrayToImage(byte[] fileBytes) 
{ 
    using (MemoryStream fileStream = new MemoryStream(fileBytes)) 
    { 
     return Image.FromStream(fileStream); 
    } 
} 

rõ ràng là mã của tôi cho việc cắt/tiết kiệm sẽ mở rộng theo điều này. Nhưng tôi đã có thể trả về một đối tượng Hình ảnh từ các byte tệp.