سؤال

أود استخدام libtiff للوصول إلى ملفات TIFF كبيرة جدا. أحتاج إلى وظائف مثل صفحات متعددة والبلاط، وبالتالي يبدو أن libtiff هو الطريقة الصحيحة للذهاب. هل يمكن لأي شخص أن يساعدني في كيفية استخدام Libtiff من C #؟ لقد وجدت بعض الروابط (مثل blog.bee-ee. التي تحتوي على رمز جزئي. لكنني لا أتجاوز الحصول على نسخة. لقد نظرت في FreeImage. ولكن وجدت أنه غير مناسب (الصور تقريبا. 800 MPIXEL 8 أو 16 بت رمادي -> 800-1600 ميغابايت) الحجم ولا يمكنني تحميله في الذاكرة في بيئة 32 بت)

أنا من ذوي الخبرة جدا في C / C ++، ولكن ليس في C #. هل يمكن لأي شخص أن يساعدني في غلاف أو بعض تلميحات؟

ملاحظة: أحتاج إلى صفحات للوصول إلى الطائرات الهرمية (متعددة القرار) في TIFF، والبلاط 256 × 256 للحصول على إمكانية الوصول السريع إلى أجزاء مختلفة من الصورة دون تحميلها مرة واحدة.

عدل libtiff.net. يبدو الحل أكثر عملية بالنسبة لي. أنا الآن دمجه في تطوير المنتج، وسوف ينقذني الكثير من الصداع من الدخول / الخروج من الذاكرة المدارة. لم أحاول بعد وظيفة "رد الاتصال"، والتي يبدو أنها تحل بشكل جيد بطريقة .NET. شكرا للمساعدة في Stackoverflow [/ edit

هل كانت مفيدة؟

المحلول

يمكنك تجربة libtiff.net لدينا. إنه نسخة مجانية ومفتوحة المصدر من libtiff المكتوبة باستخدام C #. أبقى API من تنفيذنا مشابها للغاية

http://bitmiracle.com/libtiff/

لقد أصدرناها للتو، لذلك قد يكون هناك أخطاء. لكن شفرة المصدر الكامل تأتي مع عدد من الاختبار، لذلك يجب إصلاح الأخطاء الأكثر وضوحا.

نصائح أخرى

يوفر WIC الدعم لملفات الصور الكبيرة جدا. هناك غلاف جميل له في .NET Framework: TiffbitMapDecoder.

الحل الأولي هو استخدام غلاف C # .NET ل LibTiff DLL. لقد وجدت ذلك libtiff ftp.. وبعد يبدو أنه يحتوي على جميع الأساليب المهمة لمكتبة libtiff. إنه يحتفظ بالذاكرة في ذاكرة LibTiff غير المدارة؛ هذا يعني أن رمز C # يجب أن يكون على دراية بهذا ونسخ البيانات عندما يحتاج إلى معالجة في التعليمات البرمجية الآمنة.

بلدي "رمز قراءة البلاط" لاختبارها قراءة مثل

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 .NET، ولكن قد يكون هذا الحل هو الصحيح لأشخاص آخرين، لذلك أتركها على Stackoverflow.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top