2012-01-25 9 views
13

लिए भागों कॉपी मैं एक पुस्तकालय है कि खोलने के लिए और एक बड़े TIFF फ़ाइल के वर्गों कॉपी कर सकते हैं के लिए देख रहा हूँ। मैंने LibTiff.Net पर देखा है जो फ़ाइल को बहुत तेज़ी से खोलता है लेकिन इसमें छवि के अनुभागों को क्रॉप करने या कॉपी करने के लिए कोई फ़ंक्शन नहीं है। मेरी छवि 100,000 x 100,000 पिक्सेल ऊपर है और उस आकार के System.Drawing.Bitmap को एप्लिकेशन को क्रैश करता है जो कि Bitmap में कनवर्ट करने वाला पहला विकल्प नहीं है।.NET में ओपन विशाल TIF और नई छवि

किसी को भी एक .NET पुस्तकालय की सिफारिश कर सकते हैं?

+0

हे भगवान, यह 40 * गीगाबाइट * है। मुझे लगता है कि यह अतिरिक्त चुनौतीपूर्ण बनाने के लिए केवल 32-बिट ऑपरेटिंग सिस्टम है? –

+0

मैं 64-बिट हार्डवेयर पर चल रहा हूं लेकिन डिस्क से पढ़ना इसे संसाधित करने का आदर्श तरीका होगा। मैं LibTiff.Net में गहराई से देख रहा हूं जिसमें स्कैनलाइन पढ़ने के लिए फ़ंक्शन हैं जो मुझे चाहिए – JWood

+0

क्या छवि रंग, ग्रेस्केल या बिलीवेल है? बिलीवेल के लिए मेरे पास एक देशी कोड समाधान है जो स्मृति समस्या को हल कर सकता है। मुझे ईमेल करें ([email protected])। – BitBank

उत्तर

5

यदि आपकी फ़ाइल 4GB डिस्क पर है, तो मैं आपको LibTiff.Net पर एक और नज़र डालने की सलाह देता हूं। यहां तक ​​कि ऐसी बड़ी छवियों के साथ आपके पास कुछ विकल्प हैं।

सबसे पहले, जाँच अपनी छवि टाइलों या छीन लिया है या नहीं। Tiff.IsTiled विधि आपको जवाब देगी।

अपनी छवि टाइलों है, तो आप शायद यह ReadScanline पद्धति का उपयोग करके पढ़ नहीं करना चाहिए। उस मामले में ReadEncodedTile विधि का उपयोग करना बेहतर हो सकता है।

यदि आपकी छवियां छीन ली गई हैं, तो आप इसे पढ़ने के लिए ReadScanline और ReadEncodedStrip विधियों का उपयोग कर सकते हैं।

यदि आप ReadRGBATile या ReadRGBAStrip का उपयोग करने की कोशिश करने से कुछ System.Drawing.Bitmap की अपेक्षा करना चाहते हैं। इन विधियों का उपयोग आपकी छवि के हिस्सों से बिटमैप्स बनाने के लिए किया जा सकता है। इस के लिए कोई नमूना है, लेकिन Convert color TIFF to a 32-bit System.Drawing.Bitmap आप कैसे एक बिटमैप के लिए एक छवि का टाइल या पट्टी में परिवर्तित करने के बारे में लगभग सभी आवश्यक जानकारी देना चाहिए।

संपादित करें:

LibTiff.Net 2.4.508 BigTiff लिए समर्थन जोड़ता है ताकि फ़ाइलों 4GB से बड़े भी समर्थित हैं।

+0

मुझे एक टाइल वाली छवि मिली है जो जेपीजी संपीड़ित है। मैं छवि का उपयोग करना चाहता हूं और इसे वापस लिखना चाहता हूं। क्या मैं ReadEnodedTile के साथ पढ़ता हूं और WriteTile या WriteEncodedTile के साथ लिखता हूं? – Krip

+0

मुझे इसे WriteEncodedTile के साथ ReadEnodedTile के साथ काम मिल गया। – Krip

4

आपकी छवि में कोई BigTIFF प्रारूप में होना चाहिए के बाद से सामान्य TIFF 4 GB से बड़ा नहीं हो सकता।

बिगटीएफएफ को libtiff के एक संशोधित संस्करण (BigTIFF website में उपलब्ध) के साथ पढ़ा जा सकता है, यह लाइब्रेरी ऐसी छवियों को संभालने की अनुमति देती है जो आप स्मृति में सभी पिक्सेल डेटा लोड किए बिना चाहते हैं।

मैं नेट के लिए बाइंडिंग नहीं देखा, लेकिन यह बहुत यह करने के लिए लंबे समय तक नहीं किया जाना चाहिए।

0

Atalasoft dotImage इस क्षमता में निर्मित TIFF विकोडक करना पड़ता है। डिकोड इंटरफ़ेस IRegionReadable है, जो आप एक स्ट्रीम में एक छवि के किसी दिए गए पृष्ठ से एक आयताकार खंड को पढ़ने की सुविधा देता है लागू करता है।

एक TIFF में, इस खंड उन्मुखीकरण टैग और छीन या टाइलों झगड़े में सम्मान टाइल्स और स्ट्रिप्स के न्यूनतम सेट का उपयोग करता है आयत को भरने के लिए।

(त्याग, मैं Atalasoft के लिए काम करते हैं और है कि इंटरफ़ेस लिखा था और TIFF विकोडक में इसे लागू)

+0

क्या स्कॉट फैक्टर का उपयोग करके टीआईएफएफ फाइलों को खोलने के लिए dotImage के साथ यह संभव है, मान लें कि 1/2 या 1/4। तो बड़ी टीआईएफएफ फ़ाइलों के लिए त्वरित रूप से थंबनेल उत्पन्न करने के लिए? मैं बड़ी टीआईएफएफ फाइलों के मेटाडेटा को कितनी तेज़ी से अपडेट कर सकता हूं? –

+0

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

+0

कृपया मुझे सूचित करें कि आप यह क्षमता कब जोड़ेंगे। यही कारण है कि मैं अपने वर्तमान टीआईएफएफ प्रसंस्करण लाइब्रेरी से दूसरे में स्विच कर सकता हूं। –

0

Bobrovsky यदि आपकी फ़ाइल छवि या टाइलों नहीं है आप की जाँच करनी चाहिए उल्लेख किया है। निम्नलिखित में, मैं एक धारा टिफ पढ़ सकते हैं और छवि के ऊपरी बाएं हिस्से काट-छांट करने स्निपेट कोड प्रस्तुत किया है।

using (Tiff input = Tiff.Open(@"imageFile.tif", "r")) 
     { 
      // get properties to use in writing output image file 
      int width = input.GetField(TiffTag.IMAGEWIDTH)[0].ToInt(); 
      int height = input.GetField(TiffTag.IMAGELENGTH)[0].ToInt(); 
      int samplesPerPixel = input.GetField(TiffTag.SAMPLESPERPIXEL)[0].ToInt(); 
      int bitsPerSample = input.GetField(TiffTag.BITSPERSAMPLE)[0].ToInt(); 
      int photo = input.GetField(TiffTag.PHOTOMETRIC)[0].ToInt(); 

      int scanlineSize = input.ScanlineSize();  
      byte[][] buffer = new byte[height][]; 
      for (int i = 0; i < height; ++i) 
      { 
       buffer[i] = new byte[scanlineSize]; 
       input.ReadScanline(buffer[i], i); 
      } 



      using (Tiff output = Tiff.Open("splitedImage.tif", "w")) 
      { 
       output.SetField(TiffTag.SAMPLESPERPIXEL, samplesPerPixel); 
       output.SetField(TiffTag.IMAGEWIDTH, width/2); 
       output.SetField(TiffTag.IMAGELENGTH, height/2); 
       output.SetField(TiffTag.BITSPERSAMPLE, bitsPerSample); 
       output.SetField(TiffTag.ROWSPERSTRIP, output.DefaultStripSize(0)); 
       output.SetField(TiffTag.PHOTOMETRIC, photo); 
       output.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG); 


       int c = 0; 
       byte[][] holder = new byte[height][]; 

       for (int i = height/2; i < height; i++) 
       //for (int j = 0; j < height/2 ; j++) 
       { 
        holder[i] = buffer[i].Skip(buffer[i].Length/2).ToArray(); 

        output.WriteScanline(holder[i], c); 
        c++; 
       } 
      } 
     } 

     System.Diagnostics.Process.Start("splitedImage.tif"); 

छवि के अन्य हिस्सों के लिए, आप लूप के लिए "i" की सीमा को बदल सकते हैं।

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