سؤال

أحاول إنشاء ملف TIFF متعدد الأطوار من صورة موجودة باستخدام رمز بوب باول:

picture.SelectActiveFrame(FrameDimension.Page, 0);
var image = new Bitmap(picture);
using (var stream = new MemoryStream())
{
    ImageCodecInfo codecInfo = null;
    foreach (var imageEncoder in ImageCodecInfo.GetImageEncoders())
    {
        if (imageEncoder.MimeType != "image/tiff") continue;
        codecInfo = imageEncoder;
        break;
    }
    var parameters = new EncoderParameters
    {
        Param = new []
        {
            new EncoderParameter(Encoder.SaveFlag, (long) EncoderValue.MultiFrame)
        }
    };
    image.Save(stream, codecInfo, parameters);

    parameters = new EncoderParameters
    {
        Param = new[]
        {
            new EncoderParameter(Encoder.SaveFlag, (long) EncoderValue.FrameDimensionPage)
        }
    };
    for (var i = 1; i < picture.GetFrameCount(FrameDimension.Page); i++)
    {
        picture.SelectActiveFrame(FrameDimension.Page, i);
        var img = new Bitmap(picture);
        image.SaveAdd(img, parameters);

    }

    parameters = new EncoderParameters
    {
        Param = new[] 
        {
            new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.Flush) 
        }
    };
    image.SaveAdd(parameters);
    stream.Flush();
}

لكنه لا يعمل (يتم تضمين الإطار الأول فقط في الصورة) ولا أعرف السبب.

ما أريد القيام به هو تغيير إطار معين من ملف TIFF (أضف التعليقات التوضيحية إليه).

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

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

المحلول 2

يبدو أن هذه العملية لا تغير كائن الصورة ولكنها تغير الدفق لذلك يجب أن أحصل على مخزن مؤقت لتيار الذاكرة وإنشاء كائن صورة آخر:

var buffer=stream.GetBuffer();
using(var newStream=new MemoryStream(buffer))
{
var result=Image.FromStream(newStream);
}

ستشمل النتيجة الآن جميع الإطارات.

نصائح أخرى

تم حذف الجزء الأول بعد التعليق

أنا أعمل مع Tiffs متعددة الصفحات باستخدام libtiff.net; ؛ لقد وجدت العديد من السريع في التعامل مع TIFF باستخدام المكتبات القياسية (تتعلق الذاكرة وأيضًا حوادث ثابتة على صور رمادية 16 بت).

ما هي صورة الاختبار الخاصة بك؟ هل جربت TIFF عديدة الإطار (ويفضل أن يكون مع "1" كبير على الإطار الأول ، A '2 في التالي وما إلى ذلك ؛ يمكن أن يساعدك ذلك على التأكد من الإطار المدرج في الملف.

قد يكون تشخيصًا مفيدًا آخر هو فائدة Tiffdump ، كما هو موضح في ثنائيات LIBTIFF (أيضًا للنوافذ). سيخبرك هذا بالضبط ما هي الإطارات التي لديك.

يرى باستخدام libtiff من C# للوصول إلى صور TIFF المبلطة

تعديل إذا كنت ترغب في فهم الأشياء .NET: لقد وجدت موردًا جديدًا على Tiffs متعددة الصفحات باستخدام وظيفة .NET القياسية (على الرغم من أنني سألتزم بـ libtiff.net): thecodeproject: حفظ الصور في ملف TIFF متعدد الصفحات ... إذا قمت بتنزيله ، فإن SavEmultipage (..) متشابه (ولكن لا يزال مختلفًا قليلاً عن الكود الخاص بك. لا سيما التدفق في النهاية يتم بطريقة مختلفة ، ويتم حذف الملف قبل الإطار الأول .../تعديل

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