前提条件 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.Options で inScaled を false にして Bitmap に変換します。この Bitmap は本来のサイズになっているので、compress メソッドでこのまま保存します。ただし、元が JPEG であるため、クオリティを保持する為に PNG として保存しています。 そして、再度読み込みむと幅は 400 で Density は 320 になっているので、そのまま表示します。 保存後 Dawable として読込んで Bitmap に変換して表示 (105行〜) BitmapFactory.Options で inScaled を 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の最新記事】
- 別に納品するわけでは無いので、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 の assets フォルダーに保存した 400x320 の画像ファイルの扱い
- 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(通知)のテスト