2010-11-22 3 views
1

色を適用する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

おそらく、あなたは、パレットで画像を使用することができますか?いずれにせよ1つの色を使用しているので、RGB部分は同じで、A部分だけが変わるため、入力から256種類のピクセル色を得ることができます。画像にアルファチャンネルの値だけが異なる256色のパレットがある場合は、画像データそのものではなく、パレットを変更するだけで済みます。 –

+0

私はあなたを理解していないか、あなたは本当に私の質問を理解していません。私が修正したいそれぞれの画像は2つのアルファ値、完全に透明、半透明/不透明です。私はRGB値を変更し、アルファ値を同じにしたい。つまり、私はパレットの概念を取得している間、アンドロイドにパレットクラスはありません。私が読んだことは何をお勧めしますか? – user432209

+0

@user:PNGファイルがパレットを使用する場合は、パレットのみを変更する必要はありません。 SDKのサポートがなくても、PNGファイル自体を生データとして読み込み、メモリストリーム経由で読み込む前にメモリ内のパレットを変更する可能性があります。非常にきれいな解決策ではありませんが、必要な場合にはパフォーマンスの向上がもたらされ、誰も優れたアイデアはありません。ただし、圧縮されたデータを処理する必要がないため、比較的簡単に行うことができます。詳細は[PNG spec](http://www.w3.org/TR/2003/REC-PNG-20031110/)を参照してください。 –

答えて

2

はあなたがBitmapで利用可能な機能を見てきました:あなたは、画素アレイは、画面のまともな部分を占める画像のために膨大であることがわかりますか? extractAlphaのようなものは役に立ちそうですね。また、Androidで実装されているような機能が、あなたのニーズに正確に合わない場合、どのようにあなたの特定のケースに適応できるかを見るための方法を見ています。私のために働いた

+0

何かがビットマップで利用できるかもしれませんが、そのサウンドから、extractAlphaはメソッドに渡すペイントのRGB値を考慮していないので(単に文書化されていない限り)、それをしません。ショットに値するかもしれません。私はそれを試してみましょう。 – user432209

+0

私はそれがあなたの全面的な問題を解決することを意味するものではなく、有用であることを意味しました。ドキュメンテーションを読んだら、drawCanvasと組み合わせて色情報を記入することについて話します。 –

+0

うわー、それは働いた!残念ながら、1.6ではなく2.2でしかありません。 1.6で奇妙な問題を抱えていますが、それは別の疑問です。 – user432209

1

答えは広場がここTransparent jpegs

をした、ライトアップした彼らは、この正確な事を行うための高速なコードスニペットを提供しています。私はextractAlphaを試しましたが、動作しませんでしたが、Squareの解決策はありました。代わりに、解決策を変更して、アルファビットではなくカラービットを変更してください。

すなわち

pixels[x] = (pixels[x] & 0xFF000000) | (color & 0x00FFFFFF); 
関連する問題