RIGHT:寄稿:東條遼平 * 色相 [#e1801fde] まずは色相についてシフトしてみたいと思います。色相は0から359度までの値を持っていますが、シフトさせたい範囲を決め、その中に入っているときだけシフトをするという風にすれば、例えば青空を夕日に変えようと思えば青は240度付近ですので、 240度からプラスマイナス何度かの間を範囲とし、その中に入っているときに 120度位シフトすれば空が赤く変わりそうです。 if(top <= bottom){ if(img->hsv[i*img->width + j].h <= top || img->hsv[i*img->width + j].h >= bottom){ img->hsv[i*img->width + j].h += degree; } }else{ if(img->hsv[i*img->width + j].h >= bottom && img->hsv[i*img->width + j].h <= top){ img->hsv[i*img->width + j].h += degree; } } if(img->hsv[i*img->width + j].h >= 360) img->hsv[i*img->width + j].h -= 360; if(img->hsv[i*img->width + j].h < 0) img->hsv[i*img->width + j].h += 360; bottomが範囲の始点、topが範囲の終点です。ここで赤の部分をシフトしようとするとどうしても0度をまたぐ必要があるので例えば330度から30度までというような指定が出来なければなりません。そのためtopがbottom以下のときとそれ以外で分岐させています。後は結果が0度から359度の間に納まるようにしています。 * 彩度 [#q6f6098d] これを大きくするとその名の通り画像があざやかになります。これも範囲を指定できるようにしておきましょう。ちなみに-255だけシフトさせると彩度は全てゼロになり、グレースケールになります。 * 明度 [#sbdd7303] これも範囲を指定できるようにしました。あまりマイナス方向にシフトしすぎると真黒になります。明るい部分を少しシフトすると艶のある画像になります。 * 全て [#z6c32d3f] ついでなので色相、彩度、明度に対し全てに範囲を指定し、全ての範囲に入っているときにHSV全てをシフトする関数を作ってみました。これで細かな指定ができます。ただCUIのプログラムではなかなか細かくしていできませんが。殆ど前述の関数を足し合わせたような関数ですが、範囲外だったときにcontinueするように直しています。 - &ref(main.c); - &ref(bitmap.c); - &ref(bitmap.h);