ノンプログラマー・プログラミング・ガイド

ほぼ独学。もはやおっさんになりかかってからプログラミングの勉強開始。HTML、CSS、JavaScript、SQL、PHP、Javaがなんとなく解る。Joomla!とandroidで書いたプログラムを配布中。iPhoneアプリ作りたいからMacくれ(下さい)。

タグ:画像

Androidアプリ内で保存した画像をギャラリーで表示させる方法です。全ては、このチュートリアル(Taking Photos Simply)にかいてあります。


要点だけ
  1. 保存先をパブリックフォルダーのPicturesにする
  2. 保存した画像をAndroidさんに教える

保存先のフォルダーを取得する

保存先のパブリックフォルダーへのパスを取得します。
File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);

ルートなので、適当に下位のフォルダー名を入れてもいいんじゃないのかと・・・・。


Androidに画像追加を知らせる

	    Intent mediaScanIntent = new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE");
	    Uri contentUri = Uri.fromFile(file);
	    mediaScanIntent.setData(contentUri);
	    this.sendBroadcast(mediaScanIntent);


fileは、保存した画像のパスです。


 

画像をAndroidの内部に保存する方法です。ひっかかったのがAndroidさんは、pngやjpgなんかは、Bitmapとして扱えるんですけど、gifは、bitmapとして扱えないみたい・・・。

pngやjpgを保存する

public String saveBitmap(Bitmap image, Context cx){
	String fileName = "filename"; 
	
	//保存先のファイル
	File file = new File(cx.getExternalCacheDir (), fileName);
	FileOutputStream outputStream;
	try {
		//change image scale
		// Bitmap resized =  Bitmap.createScaledBitmap(bmp, 100, 100, false);
	 
	  outputStream = new FileOutputStream(file);
	  image.compress(Bitmap.CompressFormat.PNG, 90, outputStream);
	  
	  outputStream.close();
	} catch (Exception e) {
	  e.printStackTrace();
	}	
	
	return fileName;
}
今書いてるコードから抜き出して、なんとなく書き換えただけなので、凄い適当なメソッドです。外部の一時フォルダーに保存するためにContextを渡してます。

肝となるのは、
image.compress(Bitmap.CompressFormat.PNG, 90, outputStream);
このcompressじゃないのかと。第一引数で画像の拡張子を指定して、第二引数で画質の指定、第三引数に出力するオブジェクトを渡します。また、PNGを指定した場合は、第二引数は意味がありません。





 

imagesizes
androidは、いろんなデバイスで動くように設計されていて、androidのアプリで画像を使う場合、それぞれのデバイスの解像度に応じて画像を用意する必要があります。最初、よくわかんなかったんですけど、たぶんこんな感じで作れば、うまくいくはず・・・。まぁ、面倒くせぇ・・・。

そのままのサイズの画像は、mdpi

パソコンで見たまんまの1px=1dpiとなるのがたぶんmdpiです!このpxサイズをそのままlayoutのdpやらに使用します。たとえば、アプリに100dp*100dpの画像を置きたい場合は、まずはパソコンで見たまんまの100px*100pxの画像を用意してやります。これがmdpiでの画像サイズです。


 

mdpiをベースに他のサイズを作る

で、mdpiをベースに他の画像サイズを計算してみます
  • hdpiは、mdpiの1.5倍
  • xdpiは、mdpiの2倍
  • xxdpiは、mdpiの3倍
たとえば、mdpiでヨコ100pxタテ100pxの画像を用意したとしたら、hdpiは150px*150pxとなり、xdpiは、200dp*200dpとなります。ちなみにldpiは、mdpiの0.75倍なんですけど、ldpiの低解像度のデバイスってあんのか・・・。

あと、この考え方が解ったならば、逆にも計算できるようになる・・はず。デザインするときに大き目のxdpiなんかでデザインして、それをmdpiに戻す場合は、xdpiの0.75倍がhdpiで、0.5倍がmdpi・・・・・。


mdpiの画像サイズは偶数にする?

mdpiの画像サイズを偶数にしとけば、hdpiで小数点以下がでないのでいいのかもしれません・・・・。まぁ、ぶっちゃげ、小数点以下の値なんて気にする必要もないような


 
 

このページのトップヘ