Невозможно записать тайлы с фотометрическим YCBCR в Libtiff.net

Я использую Libtiff.net для записи мозаичных изображений в файл tiff. Это работает нормально, если для Photometric установлено значение RBG, но если я использую YCbCr (чтобы уменьшить размер файла), я получаю сообщение об ошибке «Приложение перенесло слишком мало строк сканирования». Соответствующие фрагменты кода:

    private static Tiff CreateTiff()
    {
        var t = Tiff.Open(@"d:\test.tif", "w");
        const long TIFF_SIZE = 256;  
        t.SetField(TiffTag.IMAGEWIDTH, TIFF_SIZE);
        t.SetField(TiffTag.IMAGELENGTH, TIFF_SIZE);

        t.SetField(TiffTag.TILEWIDTH, TIFF_SIZE);
        t.SetField(TiffTag.TILELENGTH, TIFF_SIZE);

        t.SetField(TiffTag.BITSPERSAMPLE, 8);
        t.SetField(TiffTag.SAMPLESPERPIXEL, 3);

        t.SetField(TiffTag.COMPRESSION,  Compression.JPEG );
        t.SetField(TiffTag.JPEGQUALITY, 80L);

        t.SetField(TiffTag.PHOTOMETRIC, Photometric.YCBCR);

        t.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG);

        return t;
    }
    private static void Go()
    {
        var tif = CreateTiff(true);
        var bmp = Image.FromFile(@"d:\tile.bmp") as Bitmap;
        var rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
        var size = bmp.Width;
        var bands = 3;
        var bytes = new byte[size * size * bands];
        var bmpdata = bmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

        try
        {
                System.Runtime.InteropServices.Marshal.Copy(bmpdata.Scan0, bytes, 0, bytes.Length);
        }
        finally
        {
            bmp.UnlockBits(bmpdata);
            bmp.Dispose();
        }
        tif.WriteEncodedTile(0, bytes, bytes.Length);

        tif.Dispose();

        Console.ReadLine();
    }

Этот же код работает, если я использую Photometric.RGB. Даже если я пишу разделенное изображение (t.SetField(TiffTag.ROWSPERSTRIP, ROWS_PER_STRIP), tif.WriteEncodedStrip(count, bytes, bytes.Length)) с помощью Photometric.YCbCr, все работает нормально.

Почему я не могу использовать YCbCr с мозаичным изображением? Заранее спасибо.


person Orphuio    schedule 03.06.2016    source источник
comment
Вы не собираетесь уменьшать размер файла, используя YCbCr по сравнению с RGB, если только вы не субдискретизируете компоненты Cb и Cr.   -  person user3344003    schedule 05.06.2016
comment
Спасибо за ответ. Дело в том, что тесты, которые я проводил с использованием очищенного YCbCr, значительно уменьшили размер файла. Мне просто нужно сделать то же самое, используя tiled YCbCr.   -  person Orphuio    schedule 06.06.2016


Ответы (1)


Наконец-то я нашел обходной путь. Я могу установить tiff как RGB, закодировать данные пикселей как YCbCr, а затем записать их. Размер выходного изображения значительно уменьшен, как я и хотел, а затем я могу восстановить значения RGB при чтении тайлов. Но это все еще не идеальное решение: любое другое программное обеспечение распознает этот tiff как RBG, поэтому цвета будут неправильными.

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

person Orphuio    schedule 13.06.2016