SQLの窓

2017年07月04日


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

『Android の drawable フォルダーに保存した 400x320 の画像ファイルの6種類の扱いと Density』では、ファイルでは無く『表示用のリソース』という扱いでした。

それに対して assets フォルダーに保存するファイルは画像である必要も無く、単純に InputStream としてアクセスできます。(但し、assets からは読み込む事のみ可能です)

そこで、直接画像として扱う方法と、一旦別の場所に保存してから画像として扱う方法を試してみました。

前提条件

1) エミュレータとして Nexus 4 ( 768x1280 : xhdpi : 320 ) を使用しています。
2) 画像サイズは 400x320 です。
3) 画像は、assets フォルダのに保存しました。
4) ImageView に表示します
5) 以下の3つの画像です(いずれも 400x320 jpeg)
  

drawable との違い

1) 画像をファイルとして扱えるので、基本的には Bitmap として扱います。

2) ファイルのコピーには okio を使用して InputStream から OutputStream にコピーします。
	// *************************
	// ファイルコピー
	// *************************
	private void streamCopy(InputStream inputStream, OutputStream outputStream) throws Exception {

		Source source = Okio.source(inputStream);
		BufferedSink bufferedSink = Okio.buffer(Okio.sink(outputStream));
		bufferedSink.writeAll(source);

		bufferedSink.close();
		source.close();

	}


Drawable で表示 (27行〜)

ファイルからの読み込みであっても、リソースとして Drawable に読み込む場合はやはり、幅が 200 に設定されて表示は小さくなりました。



Drawable から Bitmap に変換して大きく表示 (47行〜)

Drawable から Bitmap に変換すると本来の横幅(400) になり、Density も 320 でこのまま表示すると正しい大きさで表示されるので、setDensity(160) で大きく表示するようにしました。



Bitmap で表示 (74行〜)

普通に Bitmap として読み込んで、Bitmap として表示します。サイズも密度も思った通りの状態となります。



いったんコピーしてBitmap で表示 (95行〜)

コピー後は書き込み可能なフォルダに環境が変わる事を除いて、assets から読み込むのと変わり無く普通に表示されます。



コピー後のファイルを Bitmap で大きく表示 (123行〜)

setDensity(160) で大きく表示します



コピー後のファイルを Bitmap で小さく表示 (154行〜)

setDensity(640) で小さく表示します



public class MainActivity extends AppCompatActivity {

	AssetManager assetManager;
	ImageView imageView;
	ImageView imageViewSaved;
	Drawable drawable;
	Bitmap bitmap;
	InputStream inputStream;
	OutputStream outputStream;

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

		assetManager = MainActivity.this.getResources().getAssets();

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

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

				try {
					inputStream = assetManager.open("sample.jpg");
					drawable = new BitmapDrawable(MainActivity.this.getResources(), inputStream);
					inputStream.close();

					Log.i("lightbox", drawable.getIntrinsicWidth()+"");		// Nexus 4 : 200, Nexus S : 267

				} catch (IOException e) {
					e.printStackTrace();
				}
				imageView.setImageDrawable(drawable);

			}
		});

		// モノクロ最大(Drawable > Bitmap > DENSITY_DEFAULT)
		MainActivity.this.findViewById(R.id.buttonAsset2).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {

				try {
					inputStream = assetManager.open("sample_mono.jpg");
					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

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

				} catch (IOException e) {
					e.printStackTrace();
				}
				imageView.setImageBitmap(bitmap);

			}
		});

		// スケッチ、そのまま(Bitmap)
		MainActivity.this.findViewById(R.id.buttonAsset3).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {

				try {
					inputStream = assetManager.open("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

				} catch (IOException e) {
					e.printStackTrace();
				}
				imageView.setImageBitmap(bitmap);

			}
		});

		// カラーを保存して表示
		MainActivity.this.findViewById(R.id.buttonSave1).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {

				try {
					// 読み込むファイル
					inputStream = assetManager.open("sample.jpg");
					// 書き込むファイル
					outputStream = MainActivity.this.openFileOutput("sample.jpg", MODE_PRIVATE);
					streamCopy(inputStream,outputStream);

					// コピーしたファイルを読み込む
					inputStream = MainActivity.this.openFileInput("sample.jpg");
					bitmap = BitmapFactory.decodeStream(inputStream);
					inputStream.close();
					Log.i("lightbox", bitmap.getWidth()+"");		// 400
					Log.i("lightbox", bitmap.getDensity()+"");	// Nexus 4 : 320, Nexus S : 240

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

				imageViewSaved.setImageBitmap(bitmap);

			}
		});

		// モノクロを保存して表示
		MainActivity.this.findViewById(R.id.buttonSave2).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {

				try {
					// 読み込むファイル
					inputStream = assetManager.open("sample_mono.jpg");
					// 書き込むファイル
					outputStream = MainActivity.this.openFileOutput("sample_mono.jpg", MODE_PRIVATE);
					streamCopy(inputStream,outputStream);

					// コピーしたファイルを読み込む
					inputStream = MainActivity.this.openFileInput("sample_mono.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);

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

				imageViewSaved.setImageBitmap(bitmap);

			}
		});

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

				try {
					// 読み込むファイル
					inputStream = assetManager.open("sample_sketch.jpg");
					// 書き込むファイル
					outputStream = MainActivity.this.openFileOutput("sample_sketch.jpg", MODE_PRIVATE);
					streamCopy(inputStream,outputStream);

					// コピーしたファイルを読み込む
					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(640);

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

				imageViewSaved.setImageBitmap(bitmap);

			}
		});
	}

}





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

Microsoft Office
container 終わり

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

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