SQLの窓

2017年07月25日


VBA : 挿入した『テキストボックス』にアクセスする



テキストボックスを挿入して、『オブジェクトと選択の表示』で一番下へ持って行って、コレクションの先頭に来るようにします( コレクションを For Each してもいいですが、ストレートに )

処理
Sub ボタン3_Click()


    MsgBox ActiveSheet.Shapes(1).TextFrame2.TextRange.Text
    
    Dim json As String
    
    json = "{" & vbCrLf
    json = json & vbTab & """link"": ""https://www.google.co.jp/""," & vbCrLf
    json = json & vbTab & """name"": ""Google""" & vbCrLf
    json = json & "}"
 
    ActiveSheet.Shapes(1).TextFrame2.TextRange.Text = json
  
  
End Sub

Form を使うのは面倒ですし、今時 Form でも無いだろうし、セルとこの方法でたいていの入力はまかなえると思います。

Shape オブジェクト (Excel)





タグ:VB VBA EXCEL
posted by lightbox at 2017-07-25 02:08 | VBA | このブログの読者になる | 更新情報をチェックする

2017年07月24日


VBA : InternetExplorer.Application 経由で JSON.parse を使用する方法

InternetExplorer.Application は終了処理が面倒で、Visible を True にすると解りますが、処理がエラーで途中で終わってしまうとメモリ上に残ってしまって後の InternetExplorer.Application の処理に悪い影響が出ます。なので、毎回作成して解放するという処理方法で利用します。

InternetExplorer.Application から直接は JSON オブジェクトにアクセスできなかったので、以下のような形でアクセスしています。( Window オブジェクトは、Document.parentWindow で取得できます )

Json オブジェクトのプロパティに予約語(たとえばこの場合、text というプロパティ)を使用したら、VB のエディタが .Text と強制変換して実行時にエラーとなりました。なので、textdata というプロパティに変更してテストしました。

Sub ボタン1_Click()

    Dim doc As Object, result As Object

    Set Ie = CreateObject("InternetExplorer.Application")
    'Ie.Visible = True
    Ie.Navigate ("about:blank")
    
    Do While Ie.Busy
        ' 100 ミリ秒
        Wscript.Sleep 100
    Loop
    
    Set doc = Ie.document
    
    doc.write "<script>document.JSON_Parse=function(s) {return JSON.parse(s);}</script>"
    
    Dim str As String
    
    str = Cells(1, 1).Value
    
    Set result = doc.JSON_Parse(str)
    
    MsgBox (str)
    
    MsgBox (result.option.textdata)
    
    Ie.Quit
    
    Set Ie = Nothing

End Sub






タグ:VBA VB EXCEL
posted by lightbox at 2017-07-24 17:56 | VBA | このブログの読者になる | 更新情報をチェックする

2017年07月23日


VBA : FileSystemObject でテキストファイル(CSV) を読み込んでセルにセットする

この記事は、『VBA : 一ヶ月の予定リストの作成』の続きです。
テンプレートシートをコピーして作業シートを作成する関数 "対象" という名前のシートがあればそれを使い、無ければ "テンプレート" シートをコピーして、"対象" と言う名前に変更します。
Function LoadSheet()
    
    ' ********************
    ' データ処理をする Sheet
    ' ********************
    Dim sheet As Worksheet
    
    ' ********************
    ' "対象" Sheet の取得
    ' ********************
    On Error Resume Next
    Set sheet = Worksheets("対象")
    On Error GoTo 0
    
    ' "対象" Sheet が無い場合は テンプレート をコピーして作成
    If sheet Is Nothing Then
        Call Worksheets("テンプレート").Copy(, Worksheets("年月入力"))
        ' コピーした Sheet の名前を変更
        Application.ActiveSheet.Name = "対象"
        ' 変数にコピーした Sheet をセット
        Set sheet = Application.ActiveSheet
    End If
    
    Set LoadSheet = sheet

End Function


※ 戻り値は、Worksheet オブジェクトです。

FileSystemObject は、ThisWorkbook に定義

Workbook_Open イベントで一度だけ実行して作成し、ブックを閉じるまでずっとそれを使います。

Public Fs As Object

Private Sub Workbook_Open()

    Set Fs = CreateObject("Scripting.FileSystemObject")

End Sub


※ Open から Line Input を使わないのは、FileSystemObject ならば 他の VB 系でも使用可能で汎用性が高いからです。

処理

※ Fs は、ThisWorkbook に定義されているので、ThisWorkbook.Fs と参照します
Sub ボタン2_Click()

    ' ********************
    ' データ処理をする Sheet
    ' ********************
    Dim sheet As Worksheet
    
    ' ********************
    ' 戻り値を取得
    ' ********************
    Set sheet = LoadSheet

    ' ********************
    ' ファイルを開く
    ' ********************
    Dim Path As String
    Path = Application.GetOpenFilename("CSV,*.csv,全て,*.*", , "CSVファイルを選択して下さい")
    If Path = "False" Then
        Exit Sub
    End If
    
    ' ********************
    ' オープン
    ' ********************
    On Error Resume Next
    Set InObj = ThisWorkbook.Fs.OpenTextFile(Path, 1)
    If Err.Number <> 0 Then
        MsgBox (Err.Description)
        Exit Sub
    End If
    On Error GoTo 0
    
    Dim Buffer As String
    Dim row As Integer: row = 0
    Dim Data() As String
    ' ********************
    ' CSV ファイルより
    ' データを読み込み
    ' ********************
    Do While Not InObj.AtEndOfStream
        Buffer = InObj.ReadLine
        
        row = row + 1
        
        Data = Split(Buffer, ",")
        
        sheet.Cells(row, 3).Value = Data(0)
        sheet.Cells(row, 4).Value = Data(1)
    Loop

    ' ********************
    ' ファイルクローズ
    ' ********************
    InObj.Close

End Sub


Application.GetOpenFilename の第二引数(FilterIndex)は省略しています。その代わり、第三引数を指定しています( タイトル文字列の指定 )

Split 関数
OpenTextFile メソッド
ReadLine メソッド






タグ:VBA VB EXCEL
posted by lightbox at 2017-07-23 20:57 | VBA | このブログの読者になる | 更新情報をチェックする

2017年07月10日


Okhttp を使用した、GET、POST、ファイルアップロードを楽に実装できる HttpAccess クラス

▼ HttpAccess パッケージのダウンロード


( 解凍して、main\java フォルダの中に コピーして下さい )
※ OkHttp より 最新の Gradle の記述を取得して build.gradle の dependencies の最後に貼り付けて下さい
例) compile 'com.squareup.okhttp3:okhttp:3.8.1'

OkHttp
okio

厳密に言うと、GET 時に渡す URL の QueryString 部分はクラス外部で作成するようになっています。仮にデータ部分を日本語で指定しても、UTF8 であれば自動的にエンコードしてくれます。また、set メソッドで URL の変更も可能です。

コンストラクタで渡す URL は、GET では必ず使用されますが、POST では実行時に指定した url KEY を使う事ができます(省略すると、コンストラクタ作成時の url を使用します)

url に関しては、Getter と Setter があります。

ファイルアップロードは1件のみの処理を想定しています。入力データとして InputStream を使い、内部で ByteArray に変換しています。Okhttp のメソッドが InputStream には対応していないので、複数ファイルアップロードは、一度にひとつのファイルになるよう外部でコントロールが必要になるでしょう。
import android.os.AsyncTask;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import okhttp3.Call;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okio.BufferedSink;
import okio.Okio;
import okio.Source;

public class HttpAccess {

	private OkHttpClient okHttpClient;
	private String url;

	public interface OnAsyncTaskListener {
		abstract public void onAsyncTaskListener(String s);
	}

	// url の Getter と Setter
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}

	// *******************************
	// コンストラクタ
	// *******************************
	public HttpAccess(String url) {
		this.okHttpClient = new OkHttpClient();
		this.url = url;
	}

	// *******************************
	// GET
	// *******************************
	public void sendGet(final OnAsyncTaskListener listener ) {

		new AsyncTask<Void,Void,String>(){
			@Override
			protected String doInBackground(Void... params) {
				String result = "[\"error\"]";

				Request.Builder builder = new Request.Builder();
				builder.url(HttpAccess.this.url);
				Request request = builder.build();

				Response response = null;
				try {
					response = HttpAccess.this.okHttpClient.newCall(request).execute();
					result = response.body().string();
				}
				catch (IOException e) {
					e.printStackTrace();
				}

				return result;
			}

			// UI スレッド処理
			@Override
			protected void onPostExecute(String s) {
				super.onPostExecute(s);

				listener.onAsyncTaskListener(s);

			}
		}.execute();

	}

	// *******************************
	// POST
	// *******************************
	public void sendPost(HashMap<String,String> postData, final OnAsyncTaskListener listener ) {

		new AsyncTask<HashMap,Void,String>(){
			@Override
			protected String doInBackground(HashMap... params) {
				String result = "[\"error\"]";

				HashMap<String,String> postData = (HashMap<String,String>)params[0];

				// POST 用 FormBody の内容の作成
				FormBody.Builder formbodyBuilder = new FormBody.Builder();
				for(Map.Entry<String, String> e : postData.entrySet()) {
					if (  !(e.getKey()).equals("url") ) {
						formbodyBuilder.add(e.getKey(), e.getValue());
					}
				}

				// 送信用ユニットの作成
				FormBody formbody = formbodyBuilder.build();
				Request.Builder builder = new Request.Builder();

				// 引数の Map に url が無い場合は、コンストラクタの url を使用する
				if ( postData.get("url") == null ) {
					builder.url(HttpAccess.this.url) ;
				}
				else {
					builder.url( postData.get("url") );
				}

				builder.post(formbody);
				Request request = builder.build();

				Response response = null;
				try {
					response = HttpAccess.this.okHttpClient.newCall(request).execute();
					result = response.body().string();
				}
				catch (IOException e) {
					e.printStackTrace();
				}

				return result;
			}

			// UI スレッド処理
			@Override
			protected void onPostExecute(String s) {

				listener.onAsyncTaskListener(s);

			}
		}.execute(postData);

	}

	// *******************************
	// 1ファイルのアップロード(  Byte 配列使うので一つ )
	// *******************************
	public void sendUpload(String url, String field, String name, InputStream inputStream, String mime, final OnAsyncTaskListener listener ) {

		// 引数は、専用クラス
		UploadParam uploadParam = new UploadParam(url,field,name,inputStream,mime);
		new AsyncTask<UploadParam,Void,String>(){
			@Override
			protected String doInBackground(UploadParam... params) {
				String result = "[\"error\"]";

				UploadParam uploadParam = params[0];
				InputStream inputStream = uploadParam.getInputStream();
				Source source = Okio.source(inputStream);
				ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
				BufferedSink bufferedSink = Okio.buffer(Okio.sink(byteArrayOutputStream));
				try {
					bufferedSink.writeAll(source);
					bufferedSink.close();
					source.close();
				} catch (IOException e) {
					e.printStackTrace();
				}

				MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder();
				multipartBodyBuilder.setType(MultipartBody.FORM);
				multipartBodyBuilder.addFormDataPart(
						uploadParam.getField(),
						uploadParam.getName(),
						RequestBody.create(MediaType.parse(uploadParam.getMime()),byteArrayOutputStream.toByteArray())
				);
				RequestBody requestBody = multipartBodyBuilder.build();

				// 送信用のデータを作成
				Request.Builder requestBuilder = new Request.Builder();
				requestBuilder.url(uploadParam.getUrl());
				requestBuilder.post(requestBody);
				Request request = requestBuilder.build();

				// 受信用のオブジェクトの準備
				Call call = HttpAccess.this.okHttpClient.newCall(request);

				// 送信と受信
				try {

					Response response = call.execute();
					result = response.body().string();

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

				return result;

			}

			@Override
			protected void onPostExecute(String s) {

				listener.onAsyncTaskListener(s);

			}

		}.execute(uploadParam);


	}

	private class UploadParam {
		private String url;
		private String mime;
		private String field;
		private String name;
		private InputStream inputStream;

		public UploadParam(String url, String field, String name, InputStream inputStream, String mime) {
			this.url = url;
			this.mime = mime;
			this.field = field;
			this.name = name;
			this.inputStream = inputStream;
		}

		public String getUrl() {
			return url;
		}

		public String getMime() {
			return mime;
		}

		public String getField() {
			return field;
		}

		public String getName() {
			return name;
		}

		public InputStream getInputStream() {
			return inputStream;
		}
	}

}


ファイルアップロード呼び出しサンプル
				try {
					InputStream inputStream = assetManager.open("sample.jpg");
					httpAccess.sendUpload(
						"http://10.0.2.2/r101/php_upload/file_upload.php",
						"target",
						"sample.jpg",
						inputStream,
						"image/jpeg",
						new HttpAccess.OnAsyncTaskListener() {
							@Override
							public void onAsyncTaskListener(String s) {

								Log.i("lightbox", s);

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

Post 呼び出しサンプル
					HashMap<String,String> postData = new HashMap<String,String>();
					// localhost の 環境
					postData.put("url", "http://10.0.2.2/r101/login-action/syain/syain_update.php");
					postData.put("fld_code", syain_base.code );
					postData.put("fld_simei", syain_base.name );

					httpAccess.sendPost(postData,new HttpAccess.OnAsyncTaskListener() {
						@Override
						public void onAsyncTaskListener(String s) {

							Log.i("lightbox",s);

							if ( !s.equals("[\"error\"]") ) {
								// 再表示
								listView.setAdapter(arrayAdapter);
							}
							else {
								Toast.makeText(MainActivity.this,"インターネットアクセスに失敗しました",Toast.LENGTH_LONG).show();
							}

						}
					});






posted by lightbox at 2017-07-10 12:04 | 2017 Android Studio | このブログの読者になる | 更新情報をチェックする

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 | 2017 Android Studio | このブログの読者になる | 更新情報をチェックする

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 の画像ファイルの扱い



posted by lightbox at 2017-07-04 14:52 | 2017 Android Studio | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



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

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり