Как написать 8-битную шкалу серого с помощью Java? - PullRequest
0 голосов
/ 03 октября 2011

Я пытаюсь записать серое изображение в файл TIFF с помощью Sanselan.Очевидно, что хотелось бы сохранить данные в 8-битном файле с серой шкалой, но почему-то я всегда получаю 24-битный файл цвета.

Я искал форматы файлов в целом и ExifTagConstants.EXIF_TAG_PIXEL_FORMAT в частности, но не смогчтобы найти что-нибудь полезное.

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

Или мне нужно использовать другую библиотеку?

Здесь код, который я использую (без бизнес-логики и экспериментаstuff:

    Test_Only_Sanselan:
    try
    {
        final Map <String, Object> parameter = new HashMap <>();
        parameter.put(org.apache.sanselan.SanselanConstants.PARAM_KEY_COMPRESSION,
            org.apache.sanselan.formats.tiff.constants.TiffConstants.TIFF_COMPRESSION_UNCOMPRESSED);

        final java.io.OutputStream output = new java.io.FileOutputStream("Test-1.tiff");
        org.apache.sanselan.Sanselan.writeImage(image, output,
            org.apache.sanselan.ImageFormat.IMAGE_FORMAT_TIFF, parameter);
        output.close();
    }
    catch (final IOException exception)
    {
        LdfImage.log.info("! Could not create tiff image.", exception);
    }
    catch (final org.apache.sanselan.ImageWriteException exception)
    {
        LdfImage.log.info("! Could not create tiff image.", exception);
    }

Интересно, нужно ли мне добавлять специальный параметр, но я пока не нашел полезного параметра.

Ниже приведен тест средства записи изображений Java 7, которыйсоздает правильное изображение в оттенках серого, но в формате PNG, а не в формате TIFF:

    Test_Only_Java_7:
    try
    {
        final java.util.Iterator imageWriters = javax.imageio.ImageIO.getImageWritersByMIMEType ("image/png");
        final javax.imageio.ImageWriter imageWriter = (javax.imageio.ImageWriter) imageWriters.next();
        final java.io.File file = new java.io.File("Test-2.png");
        final javax.imageio.stream.ImageOutputStream output = javax.imageio.ImageIO.createImageOutputStream(file);

        imageWriter.setOutput(output);
        imageWriter.write(image);
    }
    catch (final IOException exception)
    {
        LdfImage.log.info("! Could not create tiff image.", exception);
    }

Существует ли встраивание TIFF для imageio?

1 Ответ

1 голос
/ 19 марта 2013

Я не знаком с Sanselan, но вижу, что есть константа ImageInfo.COLOR_TYPE_GRAYSCALE, я думаю, ее можно использовать в карте параметров params, заданной для writeImage.

Я не нашел javadoc для Sanselan , их ссылка не работает, у вас есть еще одна актуальная версия?

Если вы хотите использовать JAI, вы можете получить вдохновение здесь:

void get8bitImage(byte[] data, int width, int height) {
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
    byte[] rasterData = ((DataBufferByte)image.getRaster().getDataBuffer()).getData();
    System.arraycopy(pixels, 0, rasterData, 0, pixels.length); // A LOT faster than 'setData()'
}

void main(String[] argv) {
    TIFFEncodeParam ep = new TIFFEncodeParam();
    FileOutputStream out = new FileOutputStream("c:\\test.tiff");
    BufferedImage img = get8bitImage(myData);
    ImageEncoder encoder = ImageCodec.createImageEncoder("tiff", out, ep);
    encoder.encode(img);
}

Убедитесь, что BufferedImage имеет BufferedImage.TYPE_BYTE_GRAY как imageType.

...