『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); } }); } }
|
【2017 Android Studioの最新記事】
- 別に納品するわけでは無いので、Android の ListView のカスタマイズなんてこれで十分でしょ / TestArrayAdapter バージョン2
- Java : Class 構造より、update 文を作成する
- ViewSwitcher を使用した2画面アプリ (5) : SQLiteデータを更新する
- ViewSwitcher を使用した2画面アプリ (4) : SQLiteデータをインポートしてリストビューに表示する
- Android Studio にインポートして使用する SQLite データベースを MDB より作成する VBScript
- ViewSwitcher を使用した2画面アプリ (3) : 画面部分の作成と画面切り替えテスト『画面をコントロールする Helper クラスの作成』
- ViewSwitcher を使用した2画面アプリ (2) : 画面部分の作成と画面切り替えテスト『画面の作成』
- ViewSwitcher を使用した2画面アプリ (1) : 画面部分の作成と画面切り替えテスト『メニューの作成』
- OkHttp を使用した HttpAccess クラスで Web 上の 画像をダウンロードして表示するテンプレート
- OkHttp を使用した HttpAccess クラスで Web 上の PHP アプリに対してファイルをアップロードするテンプレート
- OkHttp を使用した HttpAccess クラスで Web 上の掲示板に投稿(POST)するテンプレート
- OkHttp を使用した HttpAccess クラスで Web 上のデータを取得(GET)して ListView を表示するテンプレート
- Okhttp を使用した、GET、POST、ファイルアップロードを楽に実装できる HttpAccess クラス
- Android の drawable フォルダーに保存した 400x320 の画像ファイルの6種類の扱いと Density
- Android での保存用テキストデータの扱いを okio で簡素化する
- Android 6.0 : テストの為の Runtime Permission の対応を自動化するテンプレート
- Android Studio : Runtime Permission 等の裏方作業を MainActivity にさせて、本来の処理は継承したサブクラスで行う( カメラを呼び出して画像を保存させ、I..
- Android 6.0 エミュレータで 複数の Runtime Permission の対応を簡潔に吸収するクラス( CheckMyPermission )
- Android 6.0 の Runtime Permission に対応する前に、AndroidManifest.xml に権限の記述の必要無いプライベートな書き込みで情報を収集する
- Android Studio : エミュレータで Notification(通知)のテスト