Skip to content

javax.imageio.IIOException: destination width * height * samplesPerPixel > Integer.MAX_VALUE #1864

Description

@bezverec

Při importu velkých TIF map do ProArcu jsem narazil na limit Java ImageIO.

Dostanu chybu

javax.imageio.IIOException: destination width * height * samplesPerPixel > Integer.MAX_VALUE

Příklad problematického souboru:

41174 × 29077 = 1 197 216 398 pixelů
41174 × 29077 × 3 = 3 591 649 194 vzorků

Je to na části skenovaná mapa formátu A0+, spojená Photoshopem do bigTIFF (6.84 GB), ale downsamplovaná z 16bit do 8bit RGB TIFu (3.6 GB).

Šlo mi to obejít generováním datastreamů FULL, PREVIEW a THUMBNAIL přes externí konvertor. VIPS.

Importní profil jsem použil:

# Import profile for very large map TIFFs.
# It forces external TIFF -> JPEG conversion through libvips to avoid Java ImageIO limits.

import.requiredDatastreamId=NDK_ARCHIVAL, NDK_USER
import.skippedDatastreamId=

import.tiff_to_jpg_convertor.processor=tiffToJpg
processor.tiffToJpg.type=gm
processor.tiffToJpg.exec=/opt/proarc-tools/tiff-to-jpg.sh
processor.tiffToJpg.arg=--proarc-placeholder
processor.tiffToJpg.timeout=3600000

import.ndk_archival.processor=grkMasterMap
processor.grkMasterMap.type=kdu_compress
processor.grkMasterMap.exec=/opt/proarc-tools/grk-master.sh
processor.grkMasterMap.arg=--proarc-placeholder
processor.grkMasterMap.environment.GRK_THREADS=1
processor.grkMasterMap.timeout=3600000

import.ndk_user.processor=grkUserMap
processor.grkUserMap.type=kdu_compress
processor.grkUserMap.exec=/opt/proarc-tools/grk-user.sh
processor.grkUserMap.arg=--proarc-placeholder
processor.grkUserMap.environment.GRK_THREADS=1
processor.grkUserMap.timeout=3600000

import.text_ocr.file.suffix=.ocr.txt
import.alto.file.suffix=.ocr.xml

import.image.preview.maxHeight=1000
import.image.thumbnail.maxWidth=120
import.image.thumbnail.maxHeight=128

Skript:

tiff-to-jpg.sh

Účel:

  • převádí TIFF na JPEG pro FULL
  • při argumentu -resize generuje zmenšený JPEG pro PREVIEW a THUMBNAIL
  • obchází Java ImageIO limit u obrovských TIFFů
  • používá vips thumbnail nebo vips copy

Celé znění:

#!/bin/sh
set -eu

resize=
positionals=

while [ "$#" -gt 0 ]; do
    case "$1" in
        --proarc-placeholder)
            ;;
        -resize)
            shift
            resize="${1:-}"
            ;;
        *)
            positionals="${positionals}
$1"
            ;;
    esac
    shift || true
done

input=$(printf '%s\n' "$positionals" | sed '/^$/d' | tail -n 2 | head -n 1)
output=$(printf '%s\n' "$positionals" | sed '/^$/d' | tail -n 1)

if [ -z "$input" ] || [ -z "$output" ]; then
    echo "Usage: tiff-to-jpg.sh [-resize pixels] input.tif output.jpg" >&2
    exit 2
fi

export VIPS_DISC_THRESHOLD="${VIPS_DISC_THRESHOLD:-100m}"
export VIPS_CONCURRENCY="${VIPS_CONCURRENCY:-2}"

if [ -n "$resize" ]; then
    resize=$(printf '%s' "$resize" | sed 's/x.*$//')
    exec vips thumbnail "$input" "$output[Q=90,strip,optimize_coding]" "$resize" --size down
fi

exec vips copy "$input" "$output[Q=90,strip,optimize_coding]"

Chtěl jsem se zeptat, jestli to jde vyřešit jinak. Tohle jsem zkoušel na testovací instanci 5.0.3, "chyba" je ale stejná / podobná pro jádro 4.x.x.
Nezkoušel jsem ještě tak velkou mapu exportovat a nahrát do Krameria, takže vlastně nevím, jestli má smysl to řešit, nebo je to otázka spíše akademická. Pokud s tím má někdo zkušenosti, neváhejte se mi ozvat. Takových map budu mít více, tak si nejsem jistý, jak k tomu přistoupit.

Předpokládám, že se jedná o limit Javy, ale nevím to :)

Validace JHOVE:

<?xml version="1.0" encoding="UTF-8"?>
<jhove xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schema.openpreservation.org/ois/xml/ns/jhove" xsi:schemaLocation="http://schema.openpreservation.org/ois/xml/ns/jhove https://schema.openpreservation.org/ois/xml/xsd/jhove/1.10/jhove.xsd" name="Jhove" release="1.34.0" date="2025-07-02">
 <date>2026-05-13T12:19:06+02:00</date>
 <repInfo uri="C:\temp\jhove\to-validate\mapa2_no_xmp_clean.tif">
  <reportingModule release="1.9.5" date="2024-08-22">TIFF-hul</reportingModule>
  <lastModified>2026-05-04T13:02:41+02:00</lastModified>
  <size>3591649652</size>
  <format>TIFF</format>
  <version>5.0</version>
  <status>Well-Formed and valid</status>
  <sigMatch>
  <module>TIFF-hul</module>
  </sigMatch>
  <mimeType>image/tiff</mimeType>
  <profiles>
   <profile>Baseline RGB (Class R)</profile>
   <profile>DLF Benchmark for Faithful Digital Reproductions of Monographs and Serials: color</profile>
  </profiles>
  <properties>
   <property>
    <name>TIFFMetadata</name>
    <values arity="Array" type="Property">
    <property>
     <name>ByteOrder</name>
     <values arity="Scalar" type="String">
      <value>little-endian</value>
     </values>
    </property>
    <property>
     <name>IFDs</name>
     <values arity="List" type="Property">
     <property>
      <name>Number</name>
      <values arity="Scalar" type="Integer">
       <value>1</value>
      </values>
     </property>
     <property>
      <name>IFD</name>
      <values arity="Array" type="Property">
      <property>
       <name>Offset</name>
       <values arity="Scalar" type="Long">
        <value>3591649202</value>
       </values>
      </property>
      <property>
       <name>Type</name>
       <values arity="Scalar" type="String">
        <value>TIFF</value>
       </values>
      </property>
      <property>
       <name>Entries</name>
       <values arity="List" type="Property">
       <property>
        <name>NisoImageMetadata</name>
        <values arity="Scalar" type="NISOImageMetadata">
         <value>
       <mix:mix xmlns:mix="http://www.loc.gov/mix/v20" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/mix/v20 http://www.loc.gov/standards/mix/mix20/mix20.xsd">
        <mix:BasicDigitalObjectInformation>
         <mix:ObjectIdentifier>
          <mix:objectIdentifierType>JHOVE</mix:objectIdentifierType>
         </mix:ObjectIdentifier>
         <mix:FormatDesignation>
          <mix:formatName>image/tiff</mix:formatName>
         </mix:FormatDesignation>
         <mix:byteOrder>little endian</mix:byteOrder>
         <mix:Compression>
          <mix:compressionScheme>Uncompressed</mix:compressionScheme>
         </mix:Compression>
        </mix:BasicDigitalObjectInformation>
        <mix:BasicImageInformation>
         <mix:BasicImageCharacteristics>
          <mix:imageWidth>41174</mix:imageWidth>
          <mix:imageHeight>29077</mix:imageHeight>
          <mix:PhotometricInterpretation>
           <mix:colorSpace>RGB</mix:colorSpace>
           <mix:ReferenceBlackWhite>
            <mix:Component>
             <mix:componentPhotometricInterpretation>R</mix:componentPhotometricInterpretation>
             <mix:footroom>
              <mix:numerator>0</mix:numerator>
             </mix:footroom>
             <mix:headroom>
              <mix:numerator>255</mix:numerator>
             </mix:headroom>
             </mix:Component>
            <mix:Component>
             <mix:componentPhotometricInterpretation>G</mix:componentPhotometricInterpretation>
             <mix:footroom>
              <mix:numerator>0</mix:numerator>
             </mix:footroom>
             <mix:headroom>
              <mix:numerator>255</mix:numerator>
             </mix:headroom>
             </mix:Component>
            <mix:Component>
             <mix:componentPhotometricInterpretation>B</mix:componentPhotometricInterpretation>
             <mix:footroom>
              <mix:numerator>0</mix:numerator>
             </mix:footroom>
             <mix:headroom>
              <mix:numerator>255</mix:numerator>
             </mix:headroom>
             </mix:Component>
            </mix:ReferenceBlackWhite>
          </mix:PhotometricInterpretation>
         </mix:BasicImageCharacteristics>
        </mix:BasicImageInformation>
        <mix:ImageCaptureMetadata>
         <mix:ScannerCapture>
          <mix:ScanningSystemSoftware>
           <mix:scanningSoftwareName>IrfanView</mix:scanningSoftwareName>
          </mix:ScanningSystemSoftware>
         </mix:ScannerCapture>
         <mix:orientation>normal*</mix:orientation>
        </mix:ImageCaptureMetadata>
        <mix:ImageAssessmentMetadata>
         <mix:SpatialMetrics>
          <mix:samplingFrequencyUnit>in.</mix:samplingFrequencyUnit>
          <mix:xSamplingFrequency>
           <mix:numerator>600</mix:numerator>
          </mix:xSamplingFrequency>
          <mix:ySamplingFrequency>
           <mix:numerator>600</mix:numerator>
          </mix:ySamplingFrequency>
         </mix:SpatialMetrics>
         <mix:ImageColorEncoding>
          <mix:BitsPerSample>
           <mix:bitsPerSampleValue>8</mix:bitsPerSampleValue>
           <mix:bitsPerSampleValue>8</mix:bitsPerSampleValue>
           <mix:bitsPerSampleValue>8</mix:bitsPerSampleValue>
           <mix:bitsPerSampleUnit>integer</mix:bitsPerSampleUnit>
          </mix:BitsPerSample>
          <mix:samplesPerPixel>3</mix:samplesPerPixel>
         </mix:ImageColorEncoding>
        </mix:ImageAssessmentMetadata>
       </mix:mix>
         </value>
        </values>
       </property>
       <property>
        <name>NewSubfileType</name>
        <values arity="Scalar" type="Long">
         <value>0</value>
        </values>
       </property>
       <property>
        <name>SampleFormat</name>
        <values arity="Array" type="Integer">
         <value>1</value>
         <value>1</value>
         <value>1</value>
        </values>
       </property>
       <property>
        <name>MinSampleValue</name>
        <values arity="Array" type="Integer">
         <value>0</value>
         <value>0</value>
         <value>0</value>
        </values>
       </property>
       <property>
        <name>MaxSampleValue</name>
        <values arity="Array" type="Integer">
         <value>255</value>
         <value>255</value>
         <value>255</value>
        </values>
       </property>
       <property>
        <name>TransferRange</name>
        <values arity="Array" type="Integer">
         <value>0</value>
         <value>255</value>
         <value>0</value>
         <value>255</value>
         <value>0</value>
         <value>255</value>
        </values>
       </property>
       <property>
        <name>Threshholding</name>
        <values arity="Scalar" type="Integer">
         <value>1</value>
        </values>
       </property>
       <property>
        <name>StripOffsets</name>
        <values arity="Array" type="Long">
         <value>8</value>
         <value>126486536</value>
         <value>252973064</value>
         <value>379459592</value>
         <value>505946120</value>
         <value>632432648</value>
         <value>758919176</value>
         <value>885405704</value>
         <value>1011892232</value>
         <value>1138378760</value>
         <value>1264865288</value>
         <value>1391351816</value>
         <value>1517838344</value>
         <value>1644324872</value>
         <value>1770811400</value>
         <value>1897297928</value>
         <value>2023784456</value>
         <value>2150270984</value>
         <value>2276757512</value>
         <value>2403244040</value>
         <value>2529730568</value>
         <value>2656217096</value>
         <value>2782703624</value>
         <value>2909190152</value>
         <value>3035676680</value>
         <value>3162163208</value>
         <value>3288649736</value>
         <value>3415136264</value>
         <value>3541622792</value>
        </values>
       </property>
       <property>
        <name>RowsPerStrip</name>
        <values arity="Scalar" type="Long">
         <value>1024</value>
        </values>
       </property>
       <property>
        <name>StripByteCounts</name>
        <values arity="Array" type="Long">
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>126486528</value>
         <value>50026410</value>
        </values>
       </property>
       <property>
        <name>PlanarConfiguration</name>
        <values arity="Scalar" type="Integer">
         <value>1</value>
        </values>
       </property>
       <property>
        <name>TIFFITProperties</name>
        <values arity="List" type="Property">
        <property>
         <name>BackgroundColorIndicator</name>
         <values arity="Scalar" type="String">
          <value>background not defined</value>
         </values>
        </property>
        <property>
         <name>ImageColorIndicator</name>
         <values arity="Scalar" type="String">
          <value>image not defined</value>
         </values>
        </property>
        <property>
         <name>TransparencyIndicator</name>
         <values arity="Scalar" type="String">
          <value>no transparency</value>
         </values>
        </property>
        <property>
         <name>PixelIntensityRange</name>
         <values arity="Array" type="Integer">
          <value>0</value>
          <value>255</value>
         </values>
        </property>
        <property>
         <name>RasterPadding</name>
         <values arity="Scalar" type="String">
          <value>1 byte</value>
         </values>
        </property>
        <property>
         <name>BitsPerRunLength</name>
         <values arity="Scalar" type="Integer">
          <value>8</value>
         </values>
        </property>
        <property>
         <name>BitsPerExtendedRunLength</name>
         <values arity="Scalar" type="Integer">
          <value>16</value>
         </values>
        </property>
        </values>
       </property>
       </values>
      </property>
      </values>
     </property>
     </values>
    </property>
    </values>
   </property>
  </properties>
 </repInfo>
</jhove>

exiftool:

PS D:\exiftool-13.55_64> .\exiftool.exe -G1 -a -s -u -ee .\mapa2_no_xmp_clean.tif
[ExifTool]      ExifToolVersion                 : 13.55
[System]        FileName                        : mapa2_no_xmp_clean.tif
[System]        Directory                       : .
[System]        FileSize                        : 3.6 GB
[System]        FileModifyDate                  : 2026:05:04 13:02:41+02:00
[System]        FileAccessDate                  : 2026:05:13 12:36:41+02:00
[System]        FileCreateDate                  : 2026:05:13 12:35:55+02:00
[System]        FilePermissions                 : -rw-rw-rw-
[File]          FileType                        : TIFF
[File]          FileTypeExtension               : tif
[File]          MIMEType                        : image/tiff
[File]          ExifByteOrder                   : Little-endian (Intel, II)
[IFD0]          ImageWidth                      : 41174
[IFD0]          ImageHeight                     : 29077
[IFD0]          BitsPerSample                   : 8 8 8
[IFD0]          Compression                     : Uncompressed
[IFD0]          PhotometricInterpretation       : RGB
[IFD0]          StripOffsets                    : (Binary data 302 bytes, use -b option to extract)
[IFD0]          Orientation                     : Horizontal (normal)
[IFD0]          SamplesPerPixel                 : 3
[IFD0]          RowsPerStrip                    : 1024
[IFD0]          StripByteCounts                 : (Binary data 288 bytes, use -b option to extract)
[IFD0]          XResolution                     : 600
[IFD0]          YResolution                     : 600
[IFD0]          PlanarConfiguration             : Chunky
[IFD0]          ResolutionUnit                  : inches
[IFD0]          Software                        : IrfanView
[Composite]     ImageSize                       : 41174x29077
[Composite]     Megapixels                      : 1197.2

Metadata

Metadata

Assignees

Labels

6 k testováníUrčeno pro Issue, která je třeba ověřit prakticky8a schůzkaVyjasnit na schůzce

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions