7

ColorMatrix を使用して画像全体に一定の色相値を設定しようとしています。私の目標は、どの領域の明るさを失うことなく、画像全体を同じ色で見せることです。ColorMatrix を使用して画像の色相値をシフトする方法を見つけましたが、すべてのピクセルに同じ色相値を設定する方法が見つかりませんでした。画像のすべてのピクセルを反復することでそれを行うことができますが、このアプローチは遅すぎます。ColorMatrix でそれを行うことが可能かどうかはわかりませんが、ColorMatrix アプローチ以外の可能なソリューションを受け入れています。

入力画像

色相シフト出力画像*

希望する出力画像**

*これはカラーマトリックスで行うことができます

** 反復ピクセルでこれを行うことができますが、ColorMatrix ではできません

PS: Android でこれを実行しようとしていますが、Flash、C# などの他のプラットフォームでは ColorMatrix アプローチが一般的であるため、この質問は Android に直接関係していないと思います。

4

5 に答える 5

3

と呼ばれるColorMatrixルーチンを持つQColorMatrixをチェックしてくださいRotateHue。ソースはC++ですが、他の言語に移植できます(過去に、その一部を.NETに移植したことがあり、うまく機能しました)。

于 2011-03-26T00:14:47.080 に答える
3

ここではあまり馴染みがありませんが、このリンクが役立つと信じています: http ://www.graficaobscura.com/matrix/index.htmlこれは cコードなので、C-> ColorMatrixを翻訳する必要がありますが、最後の段落に手術

Hue Rotation While Preserving Luminance

それはあなたが探しているもののようです。

于 2011-03-23T15:17:22.517 に答える
2

Flashで簡単なサンプルを作成しました(この質問はActionScriptとしてタグ付けされています)が、これがあなたが探しているものであるかどうかはわかりません:

http://megaswf.com/serve/1047061

コード:

import com.greensock.*; 
import com.greensock.easing.*;
import flash.events.MouseEvent;

colorButton.addEventListener(MouseEvent.CLICK, onColor);
resetButton.addEventListener(MouseEvent.CLICK, onReset);

function onColor(e:MouseEvent):void {
    TweenMax.to(mc, 1, {colorMatrixFilter:{colorize:0x0099ff, amount:1}});
}

function onReset(e:MouseEvent):void {
    TweenMax.to(mc, 1, {colorMatrixFilter:{colorize:0x0099ff, amount:0}});
}
于 2011-03-30T07:12:46.547 に答える
2

ColorMatrix で求めていることを正確に実行する方法はないと思います。あなたがやりたいことは、RGB から HSL 色空間に変換し、すべてのピクセルで H 定数を設定し、HSL から RGB に戻すことです。これらの色空間の変換は線形ではなく、マトリックスで表すことはできません。これらのスペースが色をパラメーター化する方法が異なるため、RGB->HSL->RGB を実行すると、何らかの劣化が発生する可能性もあります。

ColorMatrix で達成できる最も近い方法は、1 つを使用してグレースケールに変換し、もう 1 つを使用して RGB 値を重み付けする (色合いを付ける) ことだと思います。この種のことは、偽のセピア調の写真を作成するためによく使用されますが、それはあなたが求めているものではありません.

于 2011-03-26T00:24:43.187 に答える
1

これを行う簡単な方法は、色相をh(0.5、0.2、0.3)に設定する場合です。

var matrix:Array = new Array();
matrix = matrix.concat([.5, .5, .5, 0, 0]);
matrix = matrix.concat([.2, .2, .2, 0, 0]);
matrix = matrix.concat([.3, .3, .3, 0, 0]);
matrix = matrix.concat([0, 0, 0, 1, 0]);
var filter:ColorMatrixFilter = new ColorMatrixFilter(matrix);

image.filters = [filter];

輝度を完全に尊重するかどうかはわかりませんが、あなたのニーズを満たすかもしれません!

于 2011-03-23T15:25:08.303 に答える