色を適用するPNGファイルがいくつかあります。色はユーザーの選択によって変わります。別の方法で設定した3つのRGB値を使って色を変更します。 pngファイルは、シェイプの外側に完全な透過性を持つランダムなシェイプです。私は透明度を変更したくない、RGB値だけを変更したい。現在、ピクセル単位でRGB値を設定しています(下のコードを参照)。ピクセル単位ではなく(PNG)ビットマップカラーをより速く設定する
これは非常に遅く、おそらくアプリケーションでは効率的ではないことに気付きました。私はこれを行うより良い方法はありますか?
ここに私が現在行っていることがあります。
public void foo(Component component, ComponentColor compColor, int userColor) {
int h = component.getImages().getHeight();
int w = component.getImages().getWidth();
mBitmap = component.getImages().createScaledBitmap(component.getImages(), w, h, true);
int[] pixels = new int[h * w];
//Get all the pixels from the image
mBitmap[index].getPixels(pixels, 0, w, 0, 0, w, h);
//Modify the pixel array to the color the user selected
pixels = changeColor(compColor, pixels);
//Set the image to use the new pixel array
mBitmap[index].setPixels(pixels, 0, w, 0, 0, w, h);
}
public int[] changeColor(ComponentColor compColor, int[] pixels) {
int red = compColor.getRed();
int green = compColor.getGreen();
int blue = compColor.getBlue();
int alpha;
for (int i=0; i < pixels.length; i++) {
alpha = Color.alpha(pixels[i]);
if (alpha != 0) {
pixels[i] = Color.argb(alpha, red, green, blue);
}
}
return pixels;
}
おそらく、あなたは、パレットで画像を使用することができますか?いずれにせよ1つの色を使用しているので、RGB部分は同じで、A部分だけが変わるため、入力から256種類のピクセル色を得ることができます。画像にアルファチャンネルの値だけが異なる256色のパレットがある場合は、画像データそのものではなく、パレットを変更するだけで済みます。 –
私はあなたを理解していないか、あなたは本当に私の質問を理解していません。私が修正したいそれぞれの画像は2つのアルファ値、完全に透明、半透明/不透明です。私はRGB値を変更し、アルファ値を同じにしたい。つまり、私はパレットの概念を取得している間、アンドロイドにパレットクラスはありません。私が読んだことは何をお勧めしますか? – user432209
@user:PNGファイルがパレットを使用する場合は、パレットのみを変更する必要はありません。 SDKのサポートがなくても、PNGファイル自体を生データとして読み込み、メモリストリーム経由で読み込む前にメモリ内のパレットを変更する可能性があります。非常にきれいな解決策ではありませんが、必要な場合にはパフォーマンスの向上がもたらされ、誰も優れたアイデアはありません。ただし、圧縮されたデータを処理する必要がないため、比較的簡単に行うことができます。詳細は[PNG spec](http://www.w3.org/TR/2003/REC-PNG-20031110/)を参照してください。 –