お客様が提供するJPG画像をsRGB形式(sRGB IEC61966-2.1)に変換してWeb対応にする必要があります。sRGB IEC61966-2.1ラスタ画像用カラーモデル
私はImageIO
とBufferedImage
で正常にそれを行うことができますが、この操作は本当に遅いです:
val srgbSpace = ColorSpace.getInstance(ColorSpace.CS_sRGB)
val colorConversionOperation = new ColorConvertOp(srgbSpace, null)
val converted = colorConversionOperation.filter(inputImage, null)
は(すでにColorConvertOp
へRenderingHints
を提供しようとした - それは役立ちません)
を私の知る限り理解して、犯人はBufferedImage
であり、私はRaster
に取り組む必要があります。
val iccProfile = ICC_Profile.getInstance(ColorSpace.CS_sRGB)
val iccColorSpace = new ICC_ColorSpace(iccProfile)
val sourceColorSpace = inputImage.getColorModel.getColorSpace
val colorConversionOperation = new ColorConvertOp(sourceColorSpace, iccColorSpace, null)
val converted = colorConversionOperation.filter(inputImage.getRaster, null)
これは確かに大きなパフォーマンス向上をもたらしますが、Raster
の保存方法はわかりませんので、最終イメージに適切なカラースペースとカラープロファイルの情報が含まれています。
Raster
から
BufferedImage
を作成します。この場合は正しいです
Color space: RGB
Color profile: sRGB IEC61966-2.1
:
val outImage = new BufferedImage(ColorModel.getRGBdefault, converted, false, null);
私はBufferedImage
で動作
Color profile
情報を失ったことを意味し
Color space: RGB
:
私はRaster
秒で動作
Raster
を
BufferedImage
に変換すると、私は
ColorModel.getRGBdefault
を実行しますが、sRGB IEC61966-2.1の場合、
ColorModel
のインスタンスを取得する方法はわかりません。
'ColorModel.getRGBdefault'は常にsRGBの色空間にあります(APIドキュメントに記載されています)。しかし、私は同意します、出力JPEGが異なっているのは奇妙です...事は(画像を書くために 'ImageIO'とその' JPEGImageWriter'を使っていると仮定して)、ICCカラープロファイルはデフォルトでは書き込まれません。色空間はsRGBです。なんらかの理由で、 'converted'イメージの色空間はsRGBと同じですが、' isCS_sRGB() 'メソッドは' false'を返します(理由は分かりません)。 ICCプロファイルをメタデータ( 'IIOMetadata'クラス)に渡すことで、強制的にICCプロファイルを記述できると思います。 – haraldK
@haraldK IIOMedatadaにICCプロファイルを渡す例がありますか? IIOMetadata/JPEGMetadataを見ていて、ICCプロファイルを渡す方法がわかりません。私はここに何か助けとなることができれば、私のクラスパス上に12個のImageIOを持っています。 –