イトナブ石巻の紅白こと白出達彦です。
イトナブ開発合宿in滝沢市のまとめを紹介します。
イトナブ開発合宿について、概要を知りたい方はこちらをご覧ください。
今回は滝沢市でイトナブ石巻開発合宿in滝沢市を開催しました。
■開発テーマ
Canvasの静的な描画とmatrixメソッドの組み合わせで、
どのような応用が出来るか
■開発環境
Mac OS 10.9.2
Android Studio 1.1.0
■ソースコード
①layoutファイルにButtonとImageViewを追加
【hanten.xml】
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="画像を開く" />
<ImageView
android:id="@+id/imageView1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
②MainActivity
【HantenActivity】
ギャラリーで取得した画像をリサイズして反転、下に行くに連れて白の
グラデーションを濃くしていきます。
public class HantenActiviy extends Activity implements OnClickListener {
private static final int REQ_SELECT_GALLERY = 100;
private static final int REFLECTIONGAP = 4;
private static final int MAX_IMAGE_SIZE = 1024;
private ImageView mImageView1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hanten);
mImageView1 = (ImageView) findViewById(R.id.imageView1);
findViewById(R.id.button1).setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.button1) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, REQ_SELECT_GALLERY);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQ_SELECT_GALLERY && resultCode == RESULT_OK) {
setMirrorBitmap(data.getData());
}
}
private void setMirrorBitmap(Uri imageuri) {
// Bitmap画像を読み込む
Bitmap bitmapOriginal = loadBitmap(imageuri);
// 反転された画像を作成するMatrixを生成
Matrix matrix = new Matrix();
matrix.preScale(1, -1);
int height = bitmapOriginal.getHeight();
int width = bitmapOriginal.getWidth();
// 反転された画像を書き込むBitmapを生成
Bitmap reflectionImage = Bitmap.createBitmap(bitmapOriginal, 0, height / 2, width, height / 2,
matrix, false);
// オリジナルの画像に反転した画像を合成したイメージを書き込むBitmapを生成
Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
(height + height / 2), Bitmap.Config.ARGB_8888);
// 最終的なイメージへ書き込むCanvasを生成
Canvas canvas = new Canvas(bitmapWithReflection);
// オリジナルの画像を描画
canvas.drawBitmap(bitmapOriginal, 0, 0, null);
// オリジナルの画像を描画
Paint deafaultPaint = new Paint();
// 繋ぎ目を目立たなくするためにデフォルトの色を描画
canvas.drawRect(0, height, width, height + REFLECTIONGAP, deafaultPaint);
// 反転されたイメージを描画
canvas.drawBitmap(reflectionImage, 0, height + REFLECTIONGAP, null);
// 反転された部分に下にいくにつれ白くなるようグラデーションを設定
Paint paint = new Paint();
LinearGradient shader = new LinearGradient(0,
bitmapOriginal.getHeight(), 0, bitmapWithReflection.getHeight()
+ REFLECTIONGAP, 0x70ffffff, 0x00ffffff, Shader.TileMode.CLAMP);
paint.setShader(shader);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
// グラデーションを描画
canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()
+ REFLECTIONGAP, paint);
mImageView1.setImageBitmap(bitmapWithReflection);
}
private Bitmap loadBitmap(Uri imageuri) {
InputStream input = null;
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
input = getContentResolver().openInputStream(imageuri);
BitmapFactory.decodeStream(input, null, options);
int inSampleSize = calculateInSampleSize(options, MAX_IMAGE_SIZE,
MAX_IMAGE_SIZE);
input.close();
input = null;
options.inJustDecodeBounds = false;
options.inSampleSize = inSampleSize;
input = getContentResolver().openInputStream(imageuri);
Bitmap bitmap = BitmapFactory.decodeStream(input, null, options);
return bitmap;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
private int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
if (width > height) {
inSampleSize = Math.round((float) height / (float) reqHeight);
} else {
inSampleSize = Math.round((float) width / (float) reqWidth);
}
}
return inSampleSize;
}
}
コードは以下のサイトから引用させていただきました。 http://www110.kir.jp/Android/ch0614.html
ギャラリーから選んだ写真が・・・・
このように変化します。
■活用事例と可能性
反転効果の他にグレースケールをかけて写真を表示する事も可能です。 可能性としてはSNSとの連携で、編集した写真を投稿するアプリ等が考えられます。
■総括 matrixメソッドは「リサイズした際の再描画」という固定的なイメージしかなかったのですが、animationと同じような動作やギャラリーとの写真で組み合わせ等、柔軟な組み合わせ方ができる事を学ぶことができました。

0 件のコメント:
コメントを投稿