Как записать TIFF из 2D массива с плавающей точкой в Java?

#java #image #tiff

#java #изображение #tiff

Вопрос:

В программе Java у меня есть массив с плавающей точкой размером 1024 x 1024. Как я могу записать файл TIFF, соответствующий изображению, представленному этим массивом?

Пояснения:

  1. Я прошу фрагмент кода, иллюстрирующий, как написать TIFF, соответствующий массиву с плавающей точкой.
  2. Я ищу изображение в оттенках серого.
  3. Я знаю, как преобразовать массив чисел с плавающей точкой размером 1024 x 1024 в любой другой массив числовых значений размером 1024 x 1024; например, если для метода, который вы имеете в виду, требуется, скажем, 1024 x 1024 числа с плавающей точкой в диапазоне [0, 1.0), без проблем, я знаю, как преобразовать мои данные так, чтобы это ограничение соблюдалось.

Спасибо!

kjo

Комментарии:

1. Что представляют float значения — масштаб серого изображения размером 1024×1024 пикселей?

Ответ №1:

Проблема, с которой вы столкнетесь, заключается в том, что, хотя для пиксельных данных в TIFF возможно иметь значения с плавающей запятой, это не является частью базовой спецификации. TIFF — это достаточно размытая спецификация, позволяющая использовать выборки с плавающей запятой, но не для стандартизации их семантического значения. Например, у меня был клиент, у которого были образцы с плавающей запятой, сгенерированные Java-приложением (я полагаю, с использованием ImageJ), и он ожидал, что мы прочитаем их правильно. ImageJ поместили плохо сериализованную хэш-таблицу в одну из строк описания, поэтому мне пришлось предоставить им код, который работал бы для этого примера файла, но, вероятно, ни для каких других. Не будь таким Java-приложением. И если вы собираетесь использовать ImageJ для записи значений с плавающей запятой, нормализуйте свои данные между 0 и 1, потому что тогда я могу гарантировать, что, по крайней мере, мои инструменты будут правильно их считывать, не завися от семантического значения.

Хотя в спецификации baseline указано, что выборки по 16 бит на канал не являются частью базовой линии, они с большей вероятностью будут распознаны текущими потребителями TIFF. Таким образом, в долгосрочной перспективе вам может быть удобнее писать в оттенках серого с 16-битными выборками в диапазоне 0 .. 65535, если вы одержимы написанием TIFF.

Если вы думаете, что собираетесь написать несоответствующий TIFF формат, просто напишите свой собственный формат файла и опубликуйте спецификацию и код чтения и записи. Если вы преобразуете его в TIFF, вы все равно создаете новый формат, и вы нарушите работу большинства приложений, использующих TIFF, в качестве побочного эффекта. Что лучше для экосистемы?

Помните, когда вы пишете плохой TIFF, ангел поджигается.

Ответ №2:

AFAIU JAI может записывать файлы TIFF.

Ответ №3:

Каноническим стандартом для обработки изображений в формате TIFF является библиотека libtiff, которая написана на C. Можно вызвать собственный C-код из Java.

Комментарии:

1. Да, есть собственный интерфейс Java (JNI).