Androidアプリ開発 -画像を加工してセピア色にしてみる-
やりたいこと
ギャラリーから選んだ画像を加工してセピア色にしたい
ソース
画像を取得
前回の記事を参考にしつつ、画像を取得します。
当然ですが、今回はサムネイル化しません。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_GALLERY && resultCode == RESULT_OK) { try { InputStream in = getContentResolver().openInputStream(data.getData()); originalImg = BitmapFactory.decodeStream(in); in.close(); iv.setImageBitmap(originalImg); //選択した画像を表示 } catch (Exception e) { Toast.makeText(this, "画像の取得に失敗しました。", Toast.LENGTH_LONG).show(); } } }
画像加工
今回は画像を選択後にボタンをクリックしたらセピアにしてみます。
ボタンをクリックしたら以下のメソッドを呼ぶようにします。
public void sepia(){ int width = originalImg.getWidth(); int height = originalImg.getHeight(); int pixels[] = new int[width * height]; originalImg.getPixels(pixels, 0, width, 0, 0, width, height); //(1) for(int i=0; i<pixels.length; i++){ //(2) int red = (pixels[i] & 0x00FF0000) >> 16; int green = (pixels[i] & 0x0000FF00) >> 8; int blue = (pixels[i] & 0x000000FF); //(3) int gray = (77 * red + 150 * green + 29 * blue) >> 8; red = green = blue = Math.min(255, Math.round(gray)); red *= 1; green = (int) Math.abs(green*0.9); blue = (int) Math.abs(blue*0.7); pixels[i] = Color.rgb(red, green, blue); } Bitmap mFilterBitmap = Bitmap.createBitmap(pixels, 0, width, width, height, Bitmap.Config.RGB_565); iv.setImageBitmap(mFilterBitmap); }
(1)
getPixelsで、全ピクセルをpixels配列に取得しています。
(2)
pixelsには以下の形でデータが入っているので、それをそれぞれにわけます。
24~31ビット | alpha |
16~23ビット | red |
8~15ビット | green |
0~7ビット | blue |
(3)
セピアを作る式は、まずグレースケールに変換してから、さらにRGBそれぞれの値を少しいじっています。
これで作れるセピア色は、少し暗い感じがしますので数式をいじれば色々と違った感じになるかと思います。
(その他)
for文の中でgetPixcelやsetPixcelを使うという方法もありますが、これらは遅いので使っていません。
まとめ
今回のケースだと、計算式も複雑じゃないので、まだJavaでも遅くありません。
しかし、もっと色々なことをやろうとするとJavaでは時間がかかりすぎてしまいます。
画像を色々と加工したい場合は、C言語でやるのが良いと思います。
参考サイト
広告
関連記事
-
CakePHP2系でTwigを利用 -書き方のメモ-
CakePHP2系でTwigをどのように記述するかのメモ。 数パターンしか載せてないですが、だいた
-
Jenkins + iPhoneアプリ(2) -ローカルリポジトリにあるデータからipaファイル生成-
* これまで - * 最終目標 -(開発者)git(リモートリポジトリ)にソースをコミット
-
CakePHP1.3でテストコード(3) -ENUM型が使えない-
cakePHP1.3でのSimpleTestを使ったテストケースの第3回目。 今回は、テーブル構成で
-
CakePHPのモデルのキャッシュではまった -新しく追加したカラムに値が入らない-
タイトルのとおり、ちょこっとCakePHPではまったのでメモ。 * 作業内容 -MySQLで、ある
-
アプリのためにFacebookページ作成 -現時点で注意すべき点-
* 前回 会社のメルアドでFacebookページを作成する方法を載せました。 * Faceboo
-
Jenkins + DeployGate(2) -DeployGateにアプリをアップ!-
DeployGateを使ってますか? 継続的にDeployってますか? TestFlightの
-
iPhoneアプリ開発 -Bundle identifierを変えてはまった-
* 現象 Bundle identifierを変えた際にXcodeで実機に転送しようとすると以下のエ
-
iPhoneアプリをヒットさせるために大事な5つのこと
巷にはたくさんのiPhoneアプリがたくさんあります。 そして、毎日新しいアプリがリリースされていま
-
iPhoneアプリ開発 −遷移先のViewControllerに値を引き継ぎたい−
例えば、トップページに複数個のボタンがあって、「A」と「B」というボタンを押下した際に、同じView
-
MySQLのバックアップ手順 -消えたら困るものはバックアップ-
そろそろデータが消えてもらったら困るぐらいになっていたのでバックアップをとることにしました。 とい