画像ギャラリーで選択した画像を縮小して、php 経由でサーバーにアップロードできるようにする方法について質問があります。
したがって、アクションの順序は次のとおりです。
1)ギャラリーから選択した画像を取得する (DONE)
2)縮小してjpgに圧縮します(ここで立ち往生しました)
3)サーバーへのアップロード async(DONE)
1番目と3番目のステップを接続する必要があります.これまでのところ、これを行っています:
選択した画像を取得:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
Bitmap yourSelectedImage = BitmapFactory.decodeFile(picturePath);
new async_upload().execute(picturePath.toString());
}
}
非同期アップロード IT:
public class async_upload extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... arg0) {
uploadFile(arg0[0]);
return "asd";
}
@Override
protected void onPostExecute(String result) {
}
}
public int uploadFile(String sourceFileUri) {
..............Code for uploading works.......
}
そして、画像を縮小するための私の関数。
private Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException {
// Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, o);
// The new size we want to scale to
final int REQUIRED_SIZE = 640;
// Find the correct scale value. It should be the power of 2.
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true) {
if (width_tmp / 2 < REQUIRED_SIZE
|| height_tmp / 2 < REQUIRED_SIZE) {
break;
}
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}
// Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
return BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, o2);
}
ご覧のとおり、選択した画像の URI を送信してuploadFile
非同期にアップロードしています。私の問題は、選択した画像の「コピーを作成」し、元の画像の代わりにこの画像を圧縮/スケーリングして送信する方法です。もちろん、ユーザーの画像を変更したくはありませんが、縮小版を送信します。
何か案は?ありがとうございました!