2010-01-11 11 views
9

मैं बहुत बड़ी टीआईएफएफ फाइलों तक पहुंचने के लिए लिबटीफ का उपयोग करना चाहता हूं। मुझे कई पेजों और टाइल्स जैसे कार्यों की ज़रूरत है, और इसलिए लिबटीफ जाने का सही तरीका प्रतीत होता है। क्या कोई मुझे सी # से लिबटीफ का उपयोग करने में मदद कर सकता है? मुझे कुछ लिंक मिल गए हैं (जैसे blog.bee-ee जिसमें आंशिक कोड शामिल था। लेकिन मुझे संस्करण प्राप्त करने से परे नहीं मिला। मैंने FreeImage पर देखा है लेकिन यह उपयुक्त नहीं है (चित्र लगभग 800 एमपीिक्सल 8 या 16 बिट ग्रेस्केल हैं - > 800-1600 एमबीटीई) आकार और मैं इसे 32-बिट वातावरण में स्मृति में लोड नहीं कर सकता)सी # से लिबटीफ का उपयोग (टाइल किए गए टीआईएफएफ छवियों तक पहुंचने के लिए)

मैं सी/सी ++ में बहुत अनुभवी हूं, लेकिन अभी तक सी # में नहीं हूं। क्या कोई मुझे रैपर या कुछ संकेतों में मदद कर सकता है?

नोट: मैं एक टिफ में pyramidical विमानों (बहु संकल्प) तक पहुँचने के लिए 256x256 का टाइल पृष्ठों की जरूरत है, और यह एक ही बार में लोड किए बिना छवि के विभिन्न भागों के लिए तेजी से उपयोग किया है।

[संपादित करें] LibTIFF.NET समाधान मेरे लिए सबसे व्यावहारिक लग रहा था। अब मैं इसे एक उत्पाद विकास में एकीकृत कर रहा हूं, और यह मुझे प्रबंधित स्मृति के अंदर/बाहर जाने से बहुत सारे सिरदर्द बचाएगा। मैंने अभी तक 'कॉलबैक' कार्यक्षमता की कोशिश नहीं की है, जो एक नेट तरीके से अच्छी तरह हल हो रहा है। स्टैक ओवरफ्लो पर सहायता के लिए धन्यवाद [/ संपादित करें]

उत्तर

6

आप हमारे LibTiff.Net को आजमा सकते हैं। यह प्रबंधित सी # का उपयोग करके लिखित लिबटीफ का मुफ्त और खुला स्रोत संस्करण है। हमारे कार्यान्वयन का एपीआई मूल के समान ही रखा गया है।

http://bitmiracle.com/libtiff/

हम सिर्फ इसे जारी किया गया है, इसलिए वहाँ कीड़े हो सकता है। लेकिन पूर्ण स्रोत कोड कई परीक्षणों के साथ आता है, इसलिए सबसे स्पष्ट बग को ठीक किया जाना चाहिए।

+0

धन्यवाद। मेरा पहला परीक्षण अच्छा दिख रहा है। हालांकि मुझे एक रैपर वर्ग मिला, लेकिन उसके पास एक ज्ञात लेखक नहीं था और मैं जल्द ही या बाद में प्रबंधित/अप्रबंधित स्मृति संसाधनों तक पहुंच के साथ कुछ मुद्दों पर पहुंच जाऊंगा। बेंचमार्क ने मुझे गैर संपीड़ित फ़ाइलों को पढ़ने पर समकक्ष प्रदर्शन दिखाया, और 50% परफॉर्मेंस एडोब संपीड़ित पिरामिडिकल टाइल वाले टिफ पर मारा। यह मेरे लिए स्वीकार्य है। मैं संपीड़न का उपयोग न करने का निर्णय ले सकता हूं, और मैं अपने मुद्दों को स्मृति मुद्दों को हल करने के बजाय बहु-कोर अनुकूल बनाने के बेहतर होगा। – Adriaan

+0

धन्यवाद, एड्रियान हमारा कार्यान्वयन निश्चित रूप से पसंद की मूल देय भाषा से धीमा है :-) – Bobrovsky

+0

मुझे कोई फर्क नहीं पड़ता। मेरे प्रोजेक्ट प्रदर्शन के लिए कार्यक्षमता/यूरो का मतलब है। और विकास के घंटे लागत का 9 5% हैं। मैं आसानी से इस के लिए क्षतिपूर्ति करने के लिए एक quadcore में फेंक सकते हैं। इसके अलावा, जब मैं संपीड़न से दूर रहता हूं तो अंतर छोटा होता है। और मेरी फाइलें केवल 10% को संपीड़ित करती हैं, इसलिए प्रति फ़ाइल केवल एक lousy 100MByte है ;-) – Adriaan

4

डब्ल्यूआईसी बहुत बड़ी छवि फ़ाइलों के लिए समर्थन प्रदान करता है। .NET ढांचे में इसके लिए एक अच्छा रैपर है: TiffBitmapDecoder।

+1

क्या आप कुछ लिंक जोड़ सकते हैं? मैंने जो देखा है, उससे TiffBitmapDecoder एक बार में एक छवि को स्मृति में लोड करने का प्रयास करता है। मैं ऐसा नहीं कर सकता चित्र> 1 जीबीईटी हमेशा विखंडन के कारण 32-बिट मशीन पर असफल रहेगा। क्या आप विंडोज 7-विनिर्देशों का जिक्र कर रहे हैं (http://msdn.microsoft.com/en-us/library/ee720061%28VS.85%29.aspx)? – Adriaan

+0

नहीं, टीबीडी एक छवि स्टोर नहीं करता है। यहां प्रारंभ करें: http://msdn.microsoft.com/en-us/library/ms748873.aspx –

+0

आपकी सहायता के लिए धन्यवाद। दुर्भाग्य से मेरा अनुभव अलग है। Http://msdn.microsoft.com/en-us/library/ms748873.aspx में उल्लिखित चरण बिटमैप के 1 फ्रेम के आकार के साथ स्मृति के एक ब्लॉक को आवंटित करने का प्रयास करते हैं। मुझे प्रत्येक पिक्सेल तक पहुंच की आवश्यकता है बिटमैप (इसलिए फिट-टू-स्क्रीन मेमोरी सेव विकल्प नहीं), बस स्मृति के एक हिस्से में जरूरी नहीं है। जब मैं उदाहरण में दिए गए टिफ डिकोडर को चलाने का प्रयास करता हूं, तो यह आमतौर पर बिटमैप्स> 10k * 10k पर विफल रहता है। और ये सिर्फ मेरी 'छोटी परीक्षण फाइलें' हैं। मेरा लक्ष्य 800 एमपीिक्सल x 16 बिट है। यही कारण है कि मैं टाइल टीआईएफएफ फाइलों की तलाश में हूं। – Adriaan

1

मेरा प्रारंभिक समाधान LibTIFF DLL के लिए C# .NET wrapper का उपयोग करना था। मैंने इसे libtiff ftp पर पाया है। ऐसा लगता है कि LIBTIF लाइब्रेरी के सभी महत्वपूर्ण तरीकों में शामिल है। यह अप्रबंधित LibTIFF स्मृति में स्मृति रखता है; इसका मतलब है कि सी # कोड को इसके बारे में पता होना चाहिए और डेटा को कॉपी करना चाहिए जब उसे सुरक्षित कोड में संसाधित करने की आवश्यकता है।

मेरे 'टाइल पढ़ने कोड' यह

की तरह पढ़ परीक्षण करने के लिए
if (LibTIFF.IsTiled(tiff)) 
{ 
    if (LibTIFF.GetField(tiff, (int)TIFFTags.TIFFTAG_TILEWIDTH, out tileWidth) && 
     LibTIFF.GetField(tiff, (int)TIFFTags.TIFFTAG_TILELENGTH, out tileLength)) 
    { 
     uint tiles = 0; 
     IntPtr pTile = LibTIFF._malloc((int)(tileLength*tileWidth*bitsPerSample/2)); 
     for (uint y = 0; y < imageLength; y += tileLength) 
     { 
      for (uint x = 0; x < imageWidth; x += tileWidth) 
      { 
       LibTIFF.ReadTile(tiff, pTile, x, y, 0, 0); 
       tiles++; 
      } 
     }       
     LibTIFF._free(pTile); 
    } 
} 

मैं हालांकि LibTIFF की नेट बंदरगाह के लिए जाना होगा, लेकिन इस समाधान के लिए अन्य लोगों के लिए सही हो सकता है, तो मैं छोड़ यह StackOverflow पर।

+0

क्या टिल्ट टीआईएफएफ को संसाधित करने का एकमात्र तरीका है 'लिबटीफ' है? या हम .Net Framework में TiffBitmapDecoder क्लास के साथ ऐसा ही कर सकते हैं? –

+0

जो मैं देख सकता हूं, TiffBitMapDecoder फ़ाइल के हिस्सों को चुनिंदा लोड करने के लिए कार्यक्षमता प्रदान नहीं करता है (केवल पूर्ण फ्रेम को प्रस्तुत करने के लिए)। http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.tiffbitmapdecoder(v=vs.110).aspx – Adriaan

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