スポンサーサイト

-------- --:--:-- --

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【Android】Android で画像の合成と画像の出力

2011-09-06 23:05:31 Tue

Android 画像合成


画像の合成(になるのかな…)は簡単です。
CanvasオブジェクトにBitmapインスタンスの画像をdrawしまくるだけです。
座標指定もできます。

1.Bitmapインスタンスを作成

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.original); // 合成元
Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.d1); // 合成素材1
Bitmap bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.d2); // 合成素材2



2.Canvasインスタンスを作成

int width = bitmap.getWidth(); // 元ファイルの幅取得
int height = bitmap.getHeight(); // 元ファイルの高さ取得
Bitmap newbitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(newbitmap);



3.Canvas#drawBitmapでBitmapインスタンスを合成していく

canvas.drawBitmap(bitmap, 0, 0, (Paint)null); // image, x座標, y座標, Paintインスタンス
int disWidth = (width - bitmap1.getWidth()) / 2;
int disHeight = (height - bitmap1.getHeight()) / 2;
canvas.drawBitmap(bitmap1, disWidth, disHeight, (Paint)null); // 画像合成
canvas.drawBitmap(bitmap2, 0, 0, (Paint)null); // 画像合成
Paint paint = new Paint();
paint.setColor(0);
paint.setTextSize(20f);
canvas.drawText("hogehogehogehogehogehogehogehoge", 30, 50, paint); // テキスト文字列合成



※とりあえず書き込んでみる

// Canvasのコンストラクタ引数で指定したBitmapインスタンスで…
ImageView imageView = (ImageView)findViewById(R.id.image);
imageView.setImageBitmap(newbitmap);


Android 合成した画像の出力


上記の処理でCanvasに描画して画面に表示している画像をSDカードなどディスク上に出力します。

1.ContextWrapper#getContentResolverでContentResolverインスタンスを取得

ContentResolver cr = getContentResolver();



2.ImageView#getDrawableでBitmapDrawableインスタンを取得

// getDrawableメソッドで取り出したものを、BitmapDrawable形式にキャストして保存。
BitmapDrawable bd = (BitmapDrawable)imageView.getDrawable();



3.BitmapDrawable#getBitmapでBitmapインスタンスを取得

// getBitmapメソッドでビットマップファイルを取り出す。
Bitmap bmp = bd.getBitmap();



4.SDカードなど出力先フォルダの存在確認と作成(POJOな処理です)

try {
File dir = new File(directory);
if (!dir.exists()) {
dir.mkdirs();
Log.d(TAG, dir.toString() + " create");
}
if(dir.exists()){
Log.d(TAG, dir.toString() + " success!!");
}





5.ファイルを出力する(POJOな処理です)

File file = new File(directory, filename);
Log.d(TAG, "absolutepath : " + file.getAbsolutePath());
if (file.createNewFile()) {
outputStream = new FileOutputStream(file);
if (source != null) {
Log.d(TAG, "source is exist");
source.compress(CompressFormat.JPEG, 75, outputStream); // sourceはCanvasから取得したBitmapインスタンスで、FileOutputStreamインスタンスは出力先Fileインスタンスから生成したもの
} else {
Log.d(TAG, "source is not exist");
outputStream.write(jpegData);
}
}



6.出力したファイル情報をContentResolver#insertに登録する

ContentValues values = new ContentValues(7);
values.put(Images.Media.TITLE, name);
values.put(Images.Media.DISPLAY_NAME, filename);
values.put(Images.Media.DATE_TAKEN, dateTaken);
values.put(Images.Media.MIME_TYPE, "image/jpeg");
values.put(Images.Media.DATA, filePath);
return cr.insert(IMAGE_URI, values);



7.SDカードの書き込み権限をマニフェストファイルで宣言する

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


完全なクラス



package info.isann;

import info.isann.util.ImageManager;
import info.isann.util.LogUtils;
import android.app.Activity;
import android.content.ContentResolver;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;

public class ImageGoseiActivity extends Activity {

public static final String TAG_NAME = "MyTag";

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try{
doLogic();
} catch(Exception e){
Log.d(TAG_NAME, LogUtils.getStackTrace(e));
}
}

@Override
public void onResume(){
super.onResume();
try{
doLogic();
} catch(Exception e){
Log.d(TAG_NAME, LogUtils.getStackTrace(e));
}
}

private void doLogic(){

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.original);
Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.d1);
Bitmap bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.d2);

int width = bitmap.getWidth();
int height = bitmap.getHeight();

Bitmap newbitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(newbitmap);
canvas.drawBitmap(bitmap, 0, 0, (Paint)null);
int disWidth = (width - bitmap1.getWidth()) / 2;
int disHeight = (height - bitmap1.getHeight()) / 2;
canvas.drawBitmap(bitmap1, disWidth, disHeight, (Paint)null);//画像合成
canvas.drawBitmap(bitmap2, 0, 0, (Paint)null);//画像合成
Paint paint = new Paint();
paint.setColor(0);
paint.setTextSize(20f);
canvas.drawText("hogehogehogehogehogehogehogehoge", 30, 50, paint);//テキスト文字列合成

ImageView imageView = (ImageView)findViewById(R.id.image);
imageView.setImageBitmap(newbitmap);

ContentResolver cr = getContentResolver();

// getDrawableメソッドで取り出したものを、BitmapDrawable形式にキャストして保存。
BitmapDrawable bd = (BitmapDrawable)imageView.getDrawable();
// getBitmapメソッドでビットマップファイルを取り出す。
Bitmap bmp = bd.getBitmap();

ImageManager.addImageAsApplication(cr, bmp);

}

}





package info.isann.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import android.content.ContentResolver;
import android.content.ContentValues;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.provider.MediaStore.Images;
import android.text.format.DateFormat;
import android.util.Log;

public class ImageManager {

private static final String TAG = "ImageManager";
private static final String APPLICATION_NAME = "ImageGosei";
private static final Uri IMAGE_URI = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
private static final String PATH = Environment.getExternalStorageDirectory().toString() + "/" + APPLICATION_NAME;

public static Uri addImageAsApplication(ContentResolver cr, Bitmap bitmap) {
long dateTaken = System.currentTimeMillis();
String name = createName(dateTaken) + ".jpg";
return addImageAsApplication(cr, name, dateTaken, PATH, name, bitmap, null);
}

public static Uri addImageAsApplication(ContentResolver cr, String name,
long dateTaken, String directory,
String filename, Bitmap source, byte[] jpegData) {

OutputStream outputStream = null;
String filePath = directory + "/" + filename;
Log.d(TAG, "filepath : " + filePath);
try {
File dir = new File(directory);
if (!dir.exists()) {
dir.mkdirs();
Log.d(TAG, dir.toString() + " create");
}
if(dir.exists()){
Log.d(TAG, dir.toString() + " success!!");
}
File file = new File(directory, filename);
Log.d(TAG, "absolutepath : " + file.getAbsolutePath());
if (file.createNewFile()) {
outputStream = new FileOutputStream(file);
if (source != null) {
Log.d(TAG, "source is exist");
source.compress(CompressFormat.JPEG, 75, outputStream);
} else {
Log.d(TAG, "source is not exist");
outputStream.write(jpegData);
}
}

} catch (FileNotFoundException ex) {
Log.w(TAG, ex);
return null;
} catch (IOException ex) {
Log.w(TAG, ex);
return null;
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (Throwable t) {
}
}
}

ContentValues values = new ContentValues(7);
values.put(Images.Media.TITLE, name);
values.put(Images.Media.DISPLAY_NAME, filename);
values.put(Images.Media.DATE_TAKEN, dateTaken);
values.put(Images.Media.MIME_TYPE, "image/jpeg");
values.put(Images.Media.DATA, filePath);
return cr.insert(IMAGE_URI, values);
}

private static String createName(long dateTaken) {
return DateFormat.format("yyyy-MM-dd_kk.mm.ss", dateTaken).toString();
}
}


参考URL


androidアプリ開発 ImageViewの画像からBitmapを生成

ContentResolverでSDカードに画像保存

ContentResolverでlike文

Java/Android/応用編/画像合成方法

Androidエミュレーターの仮想SDカードを使う

スポンサーサイト

⇒comment

Secret

名言集
全記事(数)表示
全タイトルを表示
ブログ内検索
Loading
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。