2012-01-06 4 views
17

Byte []에서 Image로 또는 그 반대로 변환 할 수 있기를 원합니다.바이트 배열을 사용하여 두 이미지를 비교하는 방법

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; 
} 

그들은 제대로 작동하지만, 내가 할 경우 :

나는 here에서이 두 가지 방법을했습니다

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

나는 result = false를 얻을!

어떤 방법 으로든이 목표를 달성하기 위해이 방법이나 다른 기능을 수정할 수 있습니까?

감사합니다.

+0

같은 문제 : == 물건 사용하여 그림을 제외하고 http://stackoverflow.com/questions/8763630/c-sharp-gif-image-to-memorystream-and-back-lose-animation . –

+0

@OliverBernhardt이 코드를 사용해보십시오. 새로운 바이트 [] {1} .Equals (새 바이트 [] {}}) –

답변

15

==을 사용하면 오버라이드되지 않은 경우 개체 참조를 비교합니다.

두 개의 개체가 서로 다른byte[] 개체이므로 참조가 다릅니다.

개체가 일치하는지 확인하려면 항목 별 byte[] 개체를 비교해야합니다. 이 경우 SequenceEquals을 사용할 수 있습니다.

+0

또한 OP는 http : // stackoverflow와 같은 것을 읽어야합니다. .com/questions/649444/testing-equal-of-c-sharp-in-c-sharp를 사용하면 올바르게 비교하는 방법을 알 수 있습니다 .. –

+0

얼마나 어리 석 다! – Diego

+2

@ChrisShain - 질문은 다른 배열에 같은 항목을 갖는 것에 관한 것입니다. 순서는 중요하지 않습니다. 여기서 매우 중요합니다. – Oded

2

==은 동일한 개체에 대한 참조가 메모리에 있음을 의미합니다.

This은 몇 가지 다른 방식으로 바이트 배열을 비교하는 방법을 보여줍니다.

+0

그러면 false가 반환되는 이유는 무엇입니까? 'new byte [] {1} .Equals (new byte [] {1})' –

+0

@ L.B : 매우 사실입니다. 용서 해줘; 배열의 경우에는 작동하지 않습니다. 바이트 배열을 올바르게 비교하는 방법은 [here] (http://stackoverflow.com/questions/43289/comparing-two-byte-arrays-in-net)을 참조하십시오. 그에 따라 내 대답 업데이트. –

1

이미지를 다시 인코딩하면 결과 파일 (또는 바이트 배열)이 원본 버전과 약간 다를 수 있습니다. 특히 데이터베이스에서 검색 한 내용이 jpeg 파일 인 경우!

그래서 (참조 대신) 배열의 바이트를 비교하더라도 차이점을 얻을 수 있습니다.

EDIT가
만약 바이트 []는 BitMap으로 (a GIF 부호화 화상을 포함하는) 읽기
이들 4 바이트 (ARGB) 픽셀 당 바이트로 압축된다. 해당 BitMap을 (새) gif 파일 (또는 바이트 [])에 저장하면 새로 인코딩 된 파일이 다를 수 있습니다 (예 : 색이 저장된 순서). 따라서 이미지 자체는 변경되지 않지만 새 파일 (또는 byte [])이 이전 파일과 동일하다는 보장은 없습니다.

+0

왜 그렇게 될까요 ?? 그것을 피할 수있는 방법이 있습니까? – Diego

+0

@Diego - 편집 참조 –

2

필자는 최근 fileBytes를 이미지로 저장해야하는 이미지 자르기를 작성해야했습니다. 내가 한 일이 여기있다. 바라기를 이것은 당신을 도울 것입니다.

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

명백하게 자르기/저장에 대한 내 코드가 이에 따라 확장됩니다. 하지만 파일 바이트에서 Image 객체를 반환 할 수있었습니다. 여기

관련 문제