SQLの窓

2017年07月04日


Android の drawable フォルダーに保存した 400x320 の画像ファイルの6種類の扱いと Density

前提条件

1) エミュレータとして Nexus 4 ( 768x1280 : xhdpi : 320 ) を使用しています。
2) 画像サイズは 400x320 です。

3) 画像は、drawable フォルダの直下に置かれています。


4) ImageView に表示します
5) 以下の3つの画像です(いずれも 400x320 jpeg)
  

6) デバイスを変更すると、getWidth()・getDensity() の値は場合によって変化します


リソース ID で表示 (25行〜)

setImageResource で リソース IDを使用するので、Android が自動的に表示する状態です。



これは、Nexus 4 の解像度(768x1280)から言えば大きく拡大して表示されています。

Drawable に変換後、Bitmap に変換して表示  (35行〜)

単純に表示してしまうと、リソース ID で表示したものと同じ大きさになります。ここでは、横幅情報を取得して表示しており、その情報では横幅は 800(Nexus4 の場合) になっています。

そこで、setDensity で密度を倍にする事によって結果的に表示サイズを半分にしています。



これは、Nexus 4 の解像度(768x1280)から言えば正しい大きさで表示されています。

Bitmap に直接変換後表示  (54行〜)

リソースを経由して変換しているので、リソース ID で表示したものと同じ大きさになります。ここでも、横幅情報を取得して表示していますが、その情報では横幅は 800(Nexus4 の場合) になっています。

なので、setDensity で密度を倍にして妥当な大きさで表示するようにしています。



本来のサイズで保存し、そこから読み込んで表示  (70行〜)

リソースを経由した場合倍のサイズになっているので、BitmapFactory.OptionsinScaled を false にして Bitmap に変換します。この Bitmap は本来のサイズになっているので、compress メソッドでこのまま保存します。ただし、元が JPEG であるため、クオリティを保持する為に PNG として保存しています。

そして、再度読み込みむと幅は 400 で Density は 320 になっているので、そのまま表示します。



保存後 Dawable として読込んで Bitmap に変換して表示  (105行〜)

BitmapFactory.OptionsinScaled を false にして Bitmap に変換して保存します(PNG として保存)。

そして、Drawable として読み込みむと幅が 200 になるようです。こちらの思った通りの大きさにする為にさらに Bitmap に変換すると、幅は 400 に戻りました。



しかし、最初の Drawable のまま setImageDrawable で表示すると以下のように小さくなります( 200 )



JPEG 保存後 大きくして表示  (142行〜)

クオリティが劣化しますが、90% クオリティでJPEG として保存して Bitmap として読み込みます

そして、大きく表示する為に Density を小さく(160)して表示しています。




public class MainActivity extends AppCompatActivity {

	ImageView imageView;
	ImageView imageViewSaved;
	Drawable drawable;
	Bitmap bitmap;
	BitmapFactory.Options options;
	InputStream inputStream;
	OutputStream outputStream;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		imageView = (ImageView) MainActivity.this.findViewById(R.id.imageView);
		imageViewSaved = (ImageView) MainActivity.this.findViewById(R.id.imageViewSaved);

		// カラー
		MainActivity.this.findViewById(R.id.buttonResource1).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {

				// リソース ID
				imageView.setImageResource(R.drawable.sample);

			}
		});

		// モノクロ
		MainActivity.this.findViewById(R.id.buttonResource2).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {

				drawable =  MainActivity.this.getDrawable(R.drawable.sample_mono);
				Log.i("lightbox", drawable.getIntrinsicWidth()+"");	// Nexus 4 : 800, Nexus S : 600 (注) setDensity 後変化します

				bitmap = ((BitmapDrawable)drawable).getBitmap();
				Log.i("lightbox", bitmap.getWidth()+"");		// Nexus 4 : 800, Nexus S : 600
				Log.i("lightbox", bitmap.getDensity()+"");	// Nexus 4 : 320, Nexus S : 240

				// 密度を倍にすれば、表示サイズは半分に
				bitmap.setDensity(640);
				imageView.setImageBitmap(bitmap);

			}
		});

		// スケッチ
		MainActivity.this.findViewById(R.id.buttonResource3).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {

				bitmap = BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.sample_sketch);
				Log.i("lightbox", bitmap.getWidth()+"");		// Nexus 4 : 800, Nexus S : 600
				Log.i("lightbox", bitmap.getDensity()+"");	// Nexus 4 : 320, Nexus S : 240

				// 密度を倍にすれば、表示サイズは半分に
				bitmap.setDensity(640);
				imageView.setImageBitmap(bitmap);

			}
		});

		// カラー
		MainActivity.this.findViewById(R.id.buttonSave1).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {

				options = new BitmapFactory.Options();
				options.inScaled = false;
				bitmap = BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.sample,options);

				Log.i("lightbox", bitmap.getWidth()+"");		// 400
				Log.i("lightbox", bitmap.getDensity()+"");	// 160

				try {
					// 書き込みするファイル名
					outputStream = MainActivity.this.openFileOutput("sample.png", MODE_PRIVATE);
					// PNG なので quality は無視される( クオリティ維持のため PNG として保存 )
					bitmap.compress(Bitmap.CompressFormat.PNG, 0, outputStream);
					outputStream.close();

					inputStream = MainActivity.this.openFileInput("sample.png");
					bitmap = BitmapFactory.decodeStream(inputStream);
					inputStream.close();

					Log.i("lightbox", bitmap.getWidth()+"");		// 400
					Log.i("lightbox", bitmap.getDensity()+"");	// Nexus 4 : 320, Nexus S : 240

					imageViewSaved.setImageBitmap(bitmap);

				} catch (Exception e) {
					e.printStackTrace();
				}

			}
		});

		// モノクロ
		MainActivity.this.findViewById(R.id.buttonSave2).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {

				options = new BitmapFactory.Options();
				options.inScaled = false;
				bitmap = BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.sample_mono,options);

				Log.i("lightbox", bitmap.getWidth()+"");		// 400
				Log.i("lightbox", bitmap.getDensity()+"");	// 160

				try {
					// 書き込みするファイル名
					outputStream = MainActivity.this.openFileOutput("sample_mono.png", MODE_PRIVATE);
					// PNG なので quality は無視される( クオリティ維持のため PNG として保存 )
					bitmap.compress(Bitmap.CompressFormat.PNG, 0, outputStream);
					outputStream.close();

					inputStream = MainActivity.this.openFileInput("sample_mono.png");
					drawable = new BitmapDrawable(MainActivity.this.getResources(), inputStream);
					inputStream.close();
					Log.i("lightbox", drawable.getIntrinsicWidth()+"");	// Nexus 4 : 200, Nexus S : 267

					bitmap = ((BitmapDrawable)drawable).getBitmap();
					Log.i("lightbox", bitmap.getWidth()+"");		// 400
					Log.i("lightbox", bitmap.getDensity()+"");	// Nexus 4 : 320, Nexus S : 240

					imageViewSaved.setImageBitmap(bitmap);

				} catch (Exception e) {
					e.printStackTrace();
				}

			}
		});

		// スケッチ
		MainActivity.this.findViewById(R.id.buttonSave3).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {

				options = new BitmapFactory.Options();
				options.inScaled = false;
				bitmap = BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.sample_sketch,options);

				Log.i("lightbox", bitmap.getWidth()+"");		// 400
				Log.i("lightbox", bitmap.getDensity()+"");	// 160

				try {
					// 書き込みするファイル名
					outputStream = MainActivity.this.openFileOutput("sample_sketch.jpg", MODE_PRIVATE);
					// 90% JPEGとして保存
					bitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream);
					outputStream.close();

					inputStream = MainActivity.this.openFileInput("sample_sketch.jpg");
					bitmap = BitmapFactory.decodeStream(inputStream);
					inputStream.close();
					Log.i("lightbox", bitmap.getWidth()+"");		// 400
					Log.i("lightbox", bitmap.getDensity()+"");	// Nexus 4 : 320, Nexus S : 240

					// 大きく
					bitmap.setDensity(160);
					imageViewSaved.setImageBitmap(bitmap);

				} catch (Exception e) {
					e.printStackTrace();
				}

			}
		});

	}

}

関連する記事

Android の assets フォルダーに保存した 400x320 の画像ファイルの扱い



【2017 Android Studioの最新記事】
posted by lightbox at 2017-07-04 14:52 | Comment(0) | 2017 Android Studio | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり