3

インスタンスRescaleOpの明るさを変更するためにJavaクラスを使用しています。BufferedImageアルファ チャネルは常に問題を引き起こします。以下の参照を参照してください -- @trashgodの印象的な Java2D の洞察に感謝します。

、アルファチャンネルRescaleOpのインスタンスの明確な状態からのドキュメントは、単一要素コンストラクターでスケーリングされていません-私は、またはのいずれかとして解釈します。BufferedImagefloatfloat[1]

JDK6 からの引用: (強調を追加)

BufferedImages の場合、再スケーリングは色とアルファ コンポーネントに作用します。スケーリング定数のセットの数は 1 つである場合があり、その場合、同じ定数がすべての色 (ただし alpha は除く) コンポーネントに適用されます。それ以外の場合、スケーリング定数のセットの数は、ソース カラー コンポーネントの数と等しくなる可能性があります。この場合、アルファ コンポーネント(存在する場合) の再スケーリングは実行されません。どちらの場合にも当てはまらない場合、スケーリング定数のセットの数は、ソース カラー コンポーネントとアルファ コンポーネントの数に等しくなければなりません。この場合、すべてのカラー コンポーネントとアルファ コンポーネントが再スケーリングされます。

BufferedImagetypeの a の場合、BufferedImage.TYPE_INT_ARGB4 つのチャネル (RGBA) があり、アルファが最後のチャネルです。(なぜ彼らはそれを呼び出さなかったBufferedImage.TYPE_INT_RGBAのですか?) 私はRescaleOp成功せずにこれらの変換を試みました: (仮定float scaleFactor = 1.25ffloat offset = 0.0f)

new RescaleOp(scaleFactor, offset, (RenderingHints) null)

new RescaleOp(new float[] { scaleFactor },
              new float[] { offset },
              (RenderingHints) null)

new RescaleOp(new float[] { scaleFactor, scaleFactor, scaleFactor },
              new float[] { offset, offset, offset },
              (RenderingHints) null)

これだけが機能します:(仮定float alphaScaleFactor = 1.0f

new RescaleOp(new float[] { scaleFactor, scaleFactor, scaleFactor, alphaScaleFactor },
              new float[] { offset, offset, offset, offset },
              (RenderingHints) null)
  1. 公式のJDKドキュメントを誤解していますか?
  2. または、これは将来のJDKで修正できる/修正する必要があるバグですか?
  3. (実行時に) アルファ チャネル インデックスを見つける方法はありますか?
    • 役立つ可能性のある方法:
      1. ColorModel BufferedImage.getColorModel()
      2. int ColorModel.getNumColorComponents()
      3. boolean ColorModel.hasAlpha()
      4. int ColorModel.getNumComponents()(オプションのアルファチャンネルを含む場合があります)
      5. ColorSpace ColorModel.getColorSpace()

お知らせ下さい。

4

2 に答える 2

1

RescaleOpは、ダイレクト カラー モデルを持つラスターに対して 2 つの操作モードを提供します。2 つのモードは 2 つのコンストラクターに対応します。

  1. RescaleOp(float scaleFactor, float offset, RenderingHints hints)ここに示されているは、すべてのカラー コンポーネントを同じ係数でスケーリングし、アルファ チャネルを変更しません。

  2. RescaleOp(float[] scaleFactors, float[] offsets, RenderingHints hints)引用された 2 番目の例に示されているでは、「スケーリング定数のセットの数は、ソース カラー コンポーネントの数にアルファ コンポーネントを加えた数に等しくなければならない」ことが要求されます。BufferedImageタイプのTYPE_INT_ARGBには 3 つのカラー コンポーネントと 1 つのアルファ コンポーネントがあるため、scaleFactors配列には 4 つのコンポーネントが必要です。

違いは利便性です。内側のループは、それに応じて配列をステップ実行します。

int step = 0;
…
if (length > 1) {
    step = 1;
}

要約すると、最初の例は機能するはずです。2 番目と 3 番目の例はIllegalArgumentException;をスローする必要があります。宣伝どおりの 4 番目の作品です。

于 2013-08-14T08:45:13.123 に答える