2012-01-06 5 views
17

का उपयोग करके दो छवियों की तुलना कैसे करें I बाइट [] से छवि और इसके विपरीत में कनवर्ट करने में सक्षम होना चाहते हैं।बाइट एरेज़

मैं 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; 
} 

वे काम करने के लिए लग रहे हैं, लेकिन अगर मैं कार्य करें:

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 == सामान उपयोग पिक छोड़कर । बराबर (imageToByteArray (byteArrayToImage (पिक)); –

+0

@OliverBernhardt इस कोड की कोशिश 'नई बाइट [] {1} .Equals (नई बाइट [] {1})' –

उत्तर

15

== का उपयोग करता है, तो ओवरराइड नहीं वस्तु के संदर्भ की तुलना करेंगे।

चूंकि ये दो अलगbyte[] ऑब्जेक्ट्स हैं, संदर्भ अलग हैं।

आप पुष्टि करते हैं कि वे समान हैं क्रम में आइटम द्वारा byte[] वस्तुओं आइटम की तुलना करने की जरूरत है। आप इस मामले में SequenceEquals का उपयोग कर सकते हैं।

+0

साथ ही, ओपी http की तरह कुछ पढ़ना चाहिए: // stackoverflow .com/प्रश्न/64 9 444/परीक्षण-समानता-ऑफ-एरे-इन-सी-तेज, ताकि उन्हें सही तरीके से तुलना करने का विचार प्राप्त हो सके। –

+0

कितना बेवकूफ! मैंने इसे पूरी तरह से याद किया! – Diego

+2

@ क्रिसशैन - प्रश्न अलग-अलग सरणी में एक ही आइटम रखने के बारे में है - ऑर्डरिंग महत्वपूर्ण नहीं है। यह _very_ यहां महत्वपूर्ण है। – Oded

2

== मतलब है कि आप स्मृति में एक ही वस्तु के लिए एक संदर्भ है।

This में कुछ अलग अलग तरीकों से बाइट सरणियों तुलना करने के लिए कैसे पता चलता है।

+0

तो यह झूठी क्यों लौटता है? 'नया बाइट [] {1} .क्वल्स (नया बाइट [] {1})' –

+0

@ एलबी: बहुत सच है। मुझे माफ़ करदो; सरणी के लिए, यह काम नहीं करता है। बाइट एरे की तुलना कैसे करें इसके लिए [यहां] (http://stackoverflow.com/questions/43289/comparing-two-byte-arrays-in-net) देखें। तदनुसार मेरा जवाब अपडेट कर रहा है। –

1

जब आप किसी छवि को फिर से एन्कोड करते हैं, परिणामी फ़ाइल (या बाइट सरणी) मूल संस्करण से अलग (थोड़ा?) हो सकती है। विशेष रूप से यदि आप डेटाबेस से पुनर्प्राप्त करते हैं तो एक जेपीईजी फाइल थी!

तो भले ही आप सरणियों (संदर्भ के बजाय) में बाइट्स की तुलना आप मतभेदों को मिल सकती है।

संपादित
आप पढ़ सकते हैं एक बाइट [] एक BitMap में (एक GIF इनकोडिंग चित्र वाली) हैं तो वे सब बाइट्स 4 (ARGB) पिक्सेल प्रति बाइट्स में decompressed कर रहे हैं। जब आप उस बिटमैप को एक (नई) gif फ़ाइल (या बाइट []) में सहेजते हैं, तो नई एन्कोडेड फ़ाइल अलग हो सकती है (उदाहरण के लिए, ऑर्डर जिसमें रंग संग्रहीत होते हैं)। इसलिए कोई गारंटी नहीं है कि नई फ़ाइल (या बाइट []) पुरानी के समान है, हालांकि छवि स्वयं ही नहीं बदली गई है।

+0

वह क्यों होगा ?? क्या इससे बचने का कोई तरीका है? – Diego

+0

@Diego - संपादन देखें –

2

मैं हाल ही में एक छवि काटने वाला है कि एक छवि के रूप fileBytes को बचाने के लिए की जरूरत है लिखने के लिए की जरूरत है। मैंने जो किया था यह रहा। उम्मीद है कि यह आपकी मदद करेगा।

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

स्पष्ट रूप से फसल/बचत के लिए मेरा कोड इस पर विस्तार करता है। लेकिन मैं फ़ाइल बाइट्स से एक छवि ऑब्जेक्ट वापस करने में सक्षम था।