Вопрос

У меня есть приложение, которое позволяет пользователю определять область изображения и сохранить этот регион для файла. Я столкнулся с зацеплением, что не могу разобраться. Разочное изображение, которое я создаю, чтобы нарисовать выбранную область, застрял с изображением формата «MemoryBMP», кажется, что это ImageFormat, который установлен для любых несущевых загруженных растровых изображений. Проблема в том случае, моя растровое изображение создается в памяти, и я хочу сохранить его как CCITT4 битонального TIFF, но я получаю «общая ошибка произошла в GDI +» исключение. Я довольно уверен, что это связано с тем, что свойство Image.RAWFormat является то, что страшно MemoryBMP.

Image.save () имеет перегрузку, которая принимает параметр ImageFormat, и когда я использую, что прохождение ImageFormat.tiff он экономит нормально, но я не получаю возможность указать мои параметры кодера.

Единственный возможный обходной путь, о котором я могу подумать, это сохранить на диск с использованием Image.save (Image, ImageFormat), затем перезагрузите его (RawFormat теперь будет установлен на ImageFormat.tif), а затем сохранить снова, передавая настройки энкодера. Это просто глупо, хотя, должен быть лучший способ.

Вот жгутный код (это просто тестирование вещей), которые должны дать вам представление о том, что я делаю в случае, если мое предыдущее описание было недостаточно понятно:

SizeF dpiScale = GetScreenToImageDPIRatio(loadedImage);
using (Bitmap image = new Bitmap(loadedImage,
    (int)(_cropBox.Width * dpiScale.Width),
    (int)(_cropBox.Height * dpiScale.Height)))
{
    image.SetResolution(loadedImage.HorizontalResolution, 
        loadedImage.VerticalResolution);

    using (Graphics g = Graphics.FromImage(image))
    {
        g.DrawImage(loadedImage, 0, 0, new Rectangle(
            (int)(_cropBox.Location.X * dpiScale.Width),
            (int)(_cropBox.Location.Y * dpiScale.Height),
            (int)(_cropBox.Width * dpiScale.Width),
            (int)(_cropBox.Height * dpiScale.Height)),
            GraphicsUnit.Pixel);
    }

    //  It's stuck as a MemoryBmp so none of these checks will work
    if (true || image.RawFormat.Equals(ImageFormat.Tiff))
    {
        ImageCodecInfo tiffCodecInfo = ImageUtils.GetEncoderInfo("image/tiff");
        EncoderParameters myEncoderParameters = new EncoderParameters(2);

        myEncoderParameters.Param[0] = new
            EncoderParameter(System.Drawing.Imaging.Encoder.Compression,
                (long)EncoderValue.CompressionCCITT4);
        myEncoderParameters.Param[1] = new
            EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, 1L);

        image.Save(Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString() + ".tif"),
            tiffCodecInfo, myEncoderParameters);

        //  The file is a "MemoryBmp" and it's screwing things up
        //image.Save(Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString() + ".tif"),
        //    ImageFormat.Tiff);
    }
    else
    {
        //  other format saving support, blah blah blah
    }
}

О, я должен упомянуть, что «loadediimage» действительно является изображением TIFF, я пропустил ссылку на LoadedImage к Bitmap.Ctor (), чтобы увидеть, если это подскажет его к тому, что он имеет дело, но это не имеет значения.

Это было полезно?

Решение

Выяснил, что CCITT4 требует двухтональных изображений, HA! Поэтому я уехал гуглами и наткнулся на CodeProject Статья и наступил в источник. Автор предоставил довольно приличный метод для преобразования 32BPPargb до 1BPP Bi-Tonal. Я попробовал это, и это быстро (проверить около 34 мс на одну страницу), и это сделал трюк!

Я отвечаю на свой вопрос. Я надеюсь, что это по крайней мере поможет кому-то еще, кто встречается с этой проблемой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top