2012-05-14 9 views
8

पर गैर-पुनरुत्पादित परिणाम उत्पन्न करती है। मैं .NET फ्रेमवर्क का उपयोग कर रहा हूं (3.5 & 4.0) को एक टीआईएफएफ फ़ाइल लोड करने और इसे पीएनजी के रूप में सहेजने के लिए उपयोग कर रहा हूं। मुझे उसी पीएनजी फ़ाइल का उत्पादन करने के लिए दो (बाद में एक ही टीआईएफएफ फ़ाइल का उपयोग करके) (बाद में एक ही टीआईएफएफ फ़ाइल का उपयोग करने) की उम्मीद है। हालांकि, उत्पादित फाइलें 'कभी-कभी' अलग होती हैं। ,.NET Image.Save विधि Windows 64 बिट

Image sourceToConvert = Bitmap.FromFile("c:\\tmp\\F1.tif"); 
sourceToConvert.Save("c:\\tmp\\F1_gen.png", ImageFormat.Png);   

for (int i = 0; i < 100; i++) 
{ 
    sourceToConvert = Bitmap.FromFile("c:\\tmp\\F1.tif"); 
    sourceToConvert.Save("c:\\tmp\\F1_regen.png", ImageFormat.Png); 

    if (!CompareFileBytes("c:\\tmp\\F1_gen.png", "c:\\tmp\\F1_regen.png")) 
     MessageBox.Show("Diff" + i);     
} 

यह यात्रा 8, 32, 33 में 'Diff' प्रदर्शित करेगा, 73 114, 155, 196 Windows 64 पर, जबकि यह किसी भी त्रुटि प्रदर्शित नहीं करता है:

नीचे सी # कोड समस्या से पता चलता 32 बिट मशीनों पर। (मैं x86 लक्ष्य का उपयोग करता हूं; x64 लक्ष्य के साथ, यह बदतर है: पुनरावृत्ति 12, 13, 14, 15, ...)

क्या सहेजें() से पुनरुत्पादित परिणाम प्राप्त करने का कोई तरीका है?

एक नमूना छवि इस FTP site

+0

ऐसी कई सेटिंग्स हैं जो फ़ाइल को संपीड़ित करने में जाती हैं और यह रन टाइम पर कुछ कारकों के लिए अनुकूलित हो सकती है। उदाहरण के लिए, शब्दकोश आकार की तरह कुछ संकुचित आउटपुट के आकार को प्रभावित कर सकता है लेकिन फिर भी उसी डिकंप्रेस्ड डेटा को उत्पन्न करता है। तो आपकी छवियां अभी भी वही हैं, लेकिन शायद थोड़ा अलग अनुकूलित किया गया हो सकता है। शायद 64 बिट तक इमारत हुड के नीचे कुछ अलग सेटिंग्स दे रही है। आप सेव ओवरलोड के लिए एन्कोडर सेटिंग्स देख सकते थे, लेकिन मुझे हाथ से कुछ भी नहीं देखा जो संपीड़ित आउटपुट निर्धारिती बना देगा। – mafafu

+0

आपकी टिप्पणी के लिए धन्यवाद। मैं भी, माना जाता है कि छवियों को स्मृति में समान होना चाहिए (केवल .png फाइलें अलग-अलग हैं)। लेकिन मैं बीएमपी के रूप में छवियों को पढ़ने के लिए एक समारोह लिखने के लिए गया, बाइट सरणी में परिवर्तित - और वे अलग हैं (हालांकि दृश्यमान छवियों में भिन्न नहीं है)। मैंने यह भी पाया कि समस्या केवल अपेक्षाकृत बड़ी छवियों (लगभग 2600x2600 पिक्स मेरे मामले में) के साथ होती है। मैंने फ्री-इमेज जैसे तीसरे पक्ष के पुस्तकालयों के साथ भी कोशिश की - एक ही समस्या: 32 बिट पर निर्धारक, 64 बिट पर नहीं। – werner

+1

क्या आप उस F1.tif छवि pls के लिंक पोस्ट कर सकते हैं? – avs099

उत्तर

2

पर पाया जा सकता मैं व्याख्या नहीं कर सकते क्यों यह हो रहा है, लेकिन ऐसा लगता है कि finalizer धागे पर Image वस्तुओं की गैर नियतात्मक अंतिम रूप दिए जाने पर छवियों की एन्कोडिंग प्रभावित कर रहा है मुख्य धागा (ImageIDisposable लागू करता है, ताकि आप इसे का उपयोग कर जब आप समाप्त कर उस पर Dispose फोन निर्धारणात्मक यह साफ करने के लिए करना चाहिए;। अन्यथा, यह भविष्य में एक मनमाना समय में अंतिम रूप दिया जाएगा)

अगर मैं अपने उदाहरण कोड बदलने निम्नलिखित करने के लिए, मैं Save के लिए हर कॉल से एक ही परिणाम प्राप्त:

using (Image sourceToConvert = Bitmap.FromFile("c:\\tmp\\F1.tif")) 
    sourceToConvert.Save("c:\\tmp\\F1_gen.png", ImageFormat.Png);   

for (int i = 0; i < 100; i++) 
{ 
    using (Image sourceToConvert = Bitmap.FromFile("c:\\tmp\\F1.tif")) 
     sourceToConvert.Save("c:\\tmp\\F1_regen.png", ImageFormat.Png); 

    // files are the same 
} 

ध्यान दें कि मैं एक और विषमता मिला: जब एक 32-बिट (x86) चल रहा है, पहले विंडोज 7 SP1 x64 पर निर्माण दोSave पर कॉल करने के लिए अलग-अलग परिणाम लौटे, फिर प्रत्येक आगामी कॉलपर 10 ने दूसरी कॉल के समान उत्पादन किया। परीक्षण पास करने के लिए, मुझे समानता जांच करने से पहले दो सहेजने के लिए पहले दो लाइनों (लूप से पहले) दोहराना पड़ा।

+0

इसके लिए धन्यवाद! यह थोड़ी डरावनी है कि बाद में छवि को अंतिम रूप देने से इसे संशोधित करना चाहिए, लेकिन आपका समाधान पूरी तरह से काम करता है जो मैं करना चाहता हूं। अति उत्कृष्ट! – werner

संबंधित मुद्दे