Использование. net c# для преобразования изображения из jpg в указанный формат c TIFF - PullRequest
3 голосов
/ 18 февраля 2020

Я пытаюсь отправить изображения на AS-400, и он принимает только изображения в формате TIFF. Я конвертирую их, но потом жалуюсь, что

Ошибка жалуется на "нераспознанные теги tiff ...". Первые два: 317 и 531 Также: "Для кодов ошибок X'8F0E 'и X'8F0F ', битовый образец был обнаружен, который не соответствует правилам алгоритма распаковки. Дальнейшая распаковка невозможна. Проверьте целостность данных входного потока данных и повторите запрос. "

У меня есть TIFF файл, который работает, вот его детали: enter image description here

Я использую код из MSDN, который я изменил. приведенный ниже код работает, но теперь мне нужно, чтобы в кодировщике было больше одного параметра.

                Bitmap myBitmap;
                ImageCodecInfo myImageCodecInfo;
                Encoder myEncoder;
                EncoderParameter myEncoderParameter;
                EncoderParameters myEncoderParameters;

                // Create a Bitmap object based on a BMP file.
                myBitmap = new Bitmap(@"f:\testFromBlob.jpg");
                // Get an ImageCodecInfo object that represents the TIFF codec.
                myImageCodecInfo = GetEncoderInfo("image/tiff");
                //do the actual work
                myEncoder = Encoder.Compression;
                myEncoderParameters = new EncoderParameters(1);
                myEncoderParameter = new EncoderParameter(myEncoder,(long)EncoderValue.CompressionCCITT4);
                myEncoderParameters.Param[0] = myEncoderParameter;
                myBitmap.Save(@"f:\resultFromDotNet.tiff", myImageCodecInfo, myEncoderParameters);


  private static ImageCodecInfo GetEncoderInfo(String mimeType)
            {
                int j;
                ImageCodecInfo[] encoders;
                encoders = ImageCodecInfo.GetImageEncoders();
                for (j = 0; j < encoders.Length; ++j)
                {
                    if (encoders[j].MimeType == mimeType)
                        return encoders[j];
                }
                return null;
            }

Я не в своей тарелке с файлами изображений. Кто-нибудь может сказать мне, как сделать преобразование, которое соответствует настройкам из моего тестового изображения?

Я пытался изменить битовую глубину до 1, а также сжатие, не уверен, но я думаю, что может потребоваться изменить оба.

ОБНОВЛЕНИЕ - используя Magick, я могу конвертировать в рабочий формат, используя

magick convert image01.jpg -compress Group4 tiff3.tiff

Если это вообще помогает мне выбрать правильный путь для C# /. Net

Обновление 2: приведенный выше код работает, но мне нужно знать, как изменить несколько параметров по сравнению с одним. Я думаю, что, вероятно, это будет запуск в домашних условиях.

ОБНОВЛЕНИЕ 3: у меня работает несколько параметров, публикуя их здесь на случай, если это поможет кому-то еще. Теперь просто нужно подождать, пока клиент войдет и посмотреть, работает ли он для них!

Для ссылки здесь есть ссылка на документацию MS

https://docs.microsoft.com/en-us/dotnet/api/system.drawing.imaging.encoder.colordepth?view=netframework-4.8

            Bitmap myBitmap;
        ImageCodecInfo myImageCodecInfo;
        Encoder compressionEncoder;
        Encoder colorDepthEncoder;
        EncoderParameter compressionParameter;
        EncoderParameter colorDepthParameter;
        EncoderParameters myEncoderParameters;

        // Create a Bitmap object based on a BMP file.
        myBitmap = new Bitmap(@"f:\colorTest.jpg");

        // Get an ImageCodecInfo object that represents the TIFF codec.
        myImageCodecInfo = GetEncoderInfo("image/tiff");
        //do the actual work
        compressionEncoder = Encoder.Compression;
        myEncoderParameters = new EncoderParameters(2);
        compressionParameter = new EncoderParameter(compressionEncoder,(long)EncoderValue.CompressionCCITT4);

        colorDepthEncoder = Encoder.ColorDepth;
        colorDepthParameter = new EncoderParameter(colorDepthEncoder, 24L); //if needed this can be removed

        myEncoderParameters.Param[0] = compressionParameter;
        myEncoderParameters.Param[1] = colorDepthParameter;
        myBitmap.Save(@"f:\resultFromDotNet1bit.tiff", myImageCodecInfo, myEncoderParameters);

1 Ответ

0 голосов
/ 20 февраля 2020

В исходном примере кода - вместо Encoder.ColorDepth вы должны установить для параметра Encoder.Compression значение EncoderValue.CompressionCCITT4.

...