8

JavaでBufferedImageのグローバルアルファ値を変更するにはどうすればよいですか? (IE は、アルファ値が 100 のイメージ内のすべてのピクセルのアルファ値が 80 になるようにします)

4

6 に答える 6

13

@Neil Coffey: ありがとう、私もこれを探していました。ただし、あなたのコードはうまく機能しませんでした (白い背景が黒くなりました)。

私はこのようなものをコーディングしましたが、それは完全に機能します:

public void setAlpha(byte alpha) {       
    alpha %= 0xff; 
    for (int cx=0;cx<obj_img.getWidth();cx++) {          
        for (int cy=0;cy<obj_img.getHeight();cy++) {
            int color = obj_img.getRGB(cx, cy);

            int mc = (alpha << 24) | 0x00ffffff;
            int newcolor = color & mc;
            obj_img.setRGB(cx, cy, newcolor);            

        }

    }
}

obj_img は BufferedImage.TYPE_INT_ARGB です。

setAlpha((byte)125); でアルファを変更します。アルファ範囲は 0 ~ 255 になりました。

誰かがこれが役に立つことを願っています。

于 2009-04-17T21:28:57.570 に答える
4

これは古い質問なので、OPのために答えているのではなく、後でこの質問を見つけた私のような人のために答えています。

AlphaComposite

@Michaelの優れた概要で述べたように、AlphaComposite操作はアルファチャネルを変更できます。しかし、私には理解するのがやや難しい特定の方法でのみ:

ここに画像の説明を入力してください

「オーバー」操作がアルファチャネルにどのように影響するかを表す式です。さらに、これはRGBチャンネルにも影響するため、変更する必要のあるカラーデータがある場合、AlphaCompositeは答えではありません。

BufferedImageOps

LookupOp

BufferedImageOpにはいくつかの種類があります(4.10.6を参照)。より一般的なケースでは、OPのタスクはLookupOpによって満たされる可能性があります。これには、ルックアップ配列の構築が必要です。アルファチャネルのみを変更するには、RGBチャネル用にID配列(table [i] = iの配列)を指定し、アルファチャネル用に別の配列を指定します。後者の配列にtable[i] = f(i)、を入力します。ここで、f()は古いアルファ値から新しい値にマップする関数です。たとえば、「画像内のアルファ値が100のすべてのピクセルのアルファ値を80にする」場合は、を設定しtable[100] = 80ます。(全範囲は0〜255です。)コードサンプルのガウスぼかしの不透明度を上げる方法を参照してください。

RescaleOp

ただし、これらのケースのサブセットについては、ルックアップテーブルを設定する必要がない、より簡単な方法があります。f()が単純な線形関数の場合は、 RescaleOpを使用します。たとえば、を設定する場合newAlpha = oldAlpha - 20は、scaleFactorが1でオフセットが-20のRescaleOpを使用します。を設定する場合newAlpha = oldAlpha * 0.8は、0.8のscaleFactorと0のオフセットを使用します。いずれの場合も、RGBチャネルにダミーのscaleFactorsとオフセットを指定する必要があります。

new RescaleOp({1.0f, 1.0f, 1.0f, /* alpha scaleFactor */ 0.8f},
              {0f, 0f, 0f, /* alpha offset */ -20f}, null)

原理をよく説明しているが、アルファチャネルに固有ではないいくつかの例については、ここでも4.10.6を参照してください。

RescaleOpとLookupOpはどちらも、BufferedImageをインプレースで変更できます

于 2012-04-11T15:14:54.587 に答える
3

見栄えのよいアルファ変更効果を得るには、ピクセルごとの相対的なアルファ変更を使用できます (静的セットやクリッピング リニアではなく)。

public static void modAlpha(BufferedImage modMe, double modAmount) {
        //
    for (int x = 0; x < modMe.getWidth(); x++) {          
        for (int y = 0; y < modMe.getHeight(); y++) {
                //
            int argb = modMe.getRGB(x, y); //always returns TYPE_INT_ARGB
            int alpha = (argb >> 24) & 0xff;  //isolate alpha

            alpha *= modAmount; //similar distortion to tape saturation (has scrunching effect, eliminates clipping)
            alpha &= 0xff;      //keeps alpha in 0-255 range

            argb &= 0x00ffffff; //remove old alpha info
            argb |= (alpha << 24);  //add new alpha info
            modMe.setRGB(x, y, argb);            
        }
    }
}
于 2014-05-07T08:13:18.820 に答える