Androidアプリ開発 -画像を加工してセピア色にしてみる-

公開日: : Android, IT


 やりたいこと

ギャラリーから選んだ画像を加工してセピア色にしたい

 ソース

 画像を取得

前回の記事を参考にしつつ、画像を取得します。
当然ですが、今回はサムネイル化しません。

    @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言語でやるのが良いと思います。

 参考サイト

広告

関連記事

input

CakePHP2系でTwigを利用 -書き方のメモ-

CakePHP2系でTwigをどのように記述するかのメモ。 数パターンしか載せてないですが、だいた

記事を読む

Jenkins + iPhoneアプリ(2) -ローカルリポジトリにあるデータからipaファイル生成-

* これまで - * 最終目標 -(開発者)git(リモートリポジトリ)にソースをコミット

記事を読む

no image

CakePHP1.3でテストコード(3) -ENUM型が使えない-

cakePHP1.3でのSimpleTestを使ったテストケースの第3回目。 今回は、テーブル構成で

記事を読む

no image

CakePHPのモデルのキャッシュではまった -新しく追加したカラムに値が入らない-

タイトルのとおり、ちょこっとCakePHPではまったのでメモ。 * 作業内容 -MySQLで、ある

記事を読む

no image

アプリのためにFacebookページ作成 -現時点で注意すべき点-

* 前回 会社のメルアドでFacebookページを作成する方法を載せました。 * Faceboo

記事を読む

Jenkins + DeployGate(2) -DeployGateにアプリをアップ!-

DeployGateを使ってますか? 継続的にDeployってますか? TestFlightの

記事を読む

no image

iPhoneアプリ開発 -Bundle identifierを変えてはまった-

* 現象 Bundle identifierを変えた際にXcodeで実機に転送しようとすると以下のエ

記事を読む

no image

iPhoneアプリをヒットさせるために大事な5つのこと

巷にはたくさんのiPhoneアプリがたくさんあります。 そして、毎日新しいアプリがリリースされていま

記事を読む

no image

iPhoneアプリ開発 −遷移先のViewControllerに値を引き継ぎたい−

例えば、トップページに複数個のボタンがあって、「A」と「B」というボタンを押下した際に、同じView

記事を読む

no image

MySQLのバックアップ手順 -消えたら困るものはバックアップ-

そろそろデータが消えてもらったら困るぐらいになっていたのでバックアップをとることにしました。 とい

記事を読む

広告

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

広告

no image
[感想] Effective Objective-C 2.0 ☆☆☆☆★(4.5)

* 構成 - 第1章 Objective-Cに慣れる -

no image
[感想] iOSアプリテスト自動化入門 ☆☆☆(3.0)

* 構成 - Chapter 1 テスト自動化への取り組み

DeployGateを試してみた(iOS編) -DeployGateがiOSに対応-

今までのDeployGate - -[http://pplace.

iPhone/iPadアプリを開発するためにやったこと

今までに、iPhoneを3本ほどリリース((リリースしたアプリは全て1

no image
ターミナルでgitのコマンドを補完したりブランチ名を表示する – macでgitを便利に使うために –

* やりたいこと macのターミナルでgitをいじっていると -今の

→もっと見る

PAGE TOP ↑