ふだん見かける色のコードは、RGB色空間なわけですが。。
HSV(HSB)色空間に変換すると、色の操作がしやすいんですよね。
Colorクラスを使って、HSV(HSB)の色空間で、画像の色を変えるサンプル
画像ファイルを読み込み。読み込んだ画像全体の色を変更します。
色相を120度ずつ変えて、画像を保存。3回繰り返して1周してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | import java.awt.Color; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class HueEditTest { public static void main(String[] args) { try { //画像ファイルの読み込み BufferedImage img = ImageIO.read(new File("c:\\work\\input.png")); //色相を回転して保存(≒120度) editImage(img, (120f / 360f), "c:\\work\\output1.png"); //さらに色相を回転して保存(≒240度) editImage(img, (120f / 360f), "c:\\work\\output2.png"); //さらに色相を回転して保存(≒360度) editImage(img, (120f / 360f), "c:\\work\\output3.png"); } catch (Exception e) { e.printStackTrace(); } } public static void editImage(BufferedImage img, float ratio, String fileName) throws IOException { //全ピクセルを繰り返す for(int y=0 ; y<img.getHeight() ; y++) { for(int x=0 ; x<img.getWidth() ; x++) { //ピクセルごとに色を取得して、編集 Color c = new Color(img.getRGB(x, y)); c = editPixelColor(c, ratio); //編集した色をセット img.setRGB(x, y, c.getRGB()); } } //ファイルに保存 ImageIO.write(img, "png", new File(fileName)); } public static Color editPixelColor(Color c, float ratio) { //HSB色空間を取得 float[] hsb = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); //HSBで色相を変える hsb[0] = (hsb[0] + ratio) % 1.0f; //HSBをColorに戻す return Color.getHSBColor(hsb[0], hsb[1], hsb[2]); } } |
実行結果
3つの画像ファイルが作成されます。
元の画像(左上)と3つの画像は、こんな感じです。
手前の木を見るとわかりやすく、緑→青→赤→緑と変化していることがわかりますね。
元の滝の部分は、少し青を含んでいるので、赤っぽくなったり緑っぽくなったりしています。
サンプルの解説
この例では、画像全体について色相を120度変えたものです。
120度変えると、R→G→B→Rのように色が変わるので、RGBを1つずつずらしたことになります。
3回実行しているので、誤差はさておき、1周。
つまり、元に戻ります。
ちなみに、HSVとHSBは同じです。
JavaのColorクラスでは、HSBで登場していますね。