2016-07-30 6 views
0

ギャラリーから画像を選択するコードがあります。プロフィール画像として使用するにはImageViewで設定しますが、画像が大きすぎるため、アプリケーションを読み込むときにエラーが発生します。Picasaでギャラリーから選択した画像のサイズを変更する

多くの人がこの写真をサイズ変更するためにピカソを使用すると言っていましたが、どうやってそれを行うのか分かりません。もしそれをやる方法が分かっていれば、 。

これは私が選んで、画像を保存するコードです:

@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); 
     PreferenceManager.getDefaultSharedPreferences(this).edit().putString("picturePath", picturePath).commit() 



     ImageView imgView = (ImageView) findViewById(R.id.User); 
     imgView.setImageBitmap(BitmapFactory.decodeFile(picturePath)); 
     cursor.close(); 


} 

答えて

0

まずあなたのパスを取ると品質が、この中を取る失うことなく、サイズを小さくする

@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); 

    String mImageNewPath=compressImage(picturePath); 

    // used this mImageNewPath itis compress image path 
    PreferenceManager.getDefaultSharedPreferences(this).edit().putString("picturePath", picturePath).commit() 



    ImageView imgView = (ImageView) findViewById(R.id.User); 
    imgView.setImageBitmap(BitmapFactory.decodeFile(picturePath)); 
    cursor.close(); 


} 

機能を関数を呼び出しますクラスをクラスにコピーする

public String compressImage(String imageUri) { 

    String filePath = getRealPathFromURI(imageUri); 
    Bitmap scaledBitmap = null; 

    BitmapFactory.Options options = new BitmapFactory.Options(); 

//  by setting this field as true, the actual bitmap pixels are not loaded in the memory. Just the bounds are loaded. If 
//  you try the use the bitmap here, you will get null. 
    options.inJustDecodeBounds = true; 
    Bitmap bmp = BitmapFactory.decodeFile(filePath, options); 

    int actualHeight = options.outHeight; 
    int actualWidth = options.outWidth; 

//  max Height and width values of the compressed image is taken as 816x612 

    float maxHeight = 816.0f; 
    float maxWidth = 612.0f; 
    float imgRatio = actualWidth/actualHeight; 
    float maxRatio = maxWidth/maxHeight; 

//  width and height values are set maintaining the aspect ratio of the image 

    if (actualHeight > maxHeight || actualWidth > maxWidth) { 
     if (imgRatio < maxRatio) {    imgRatio = maxHeight/actualHeight;    actualWidth = (int) (imgRatio * actualWidth);    actualHeight = (int) maxHeight;    } else if (imgRatio > maxRatio) { 
     imgRatio = maxWidth/actualWidth; 
     actualHeight = (int) (imgRatio * actualHeight); 
     actualWidth = (int) maxWidth; 
     } else { 
     actualHeight = (int) maxHeight; 
     actualWidth = (int) maxWidth; 

     } 
    } 

//  setting inSampleSize value allows to load a scaled down version of the original image 

    options.inSampleSize = calculateInSampleSize(options, actualWidth, actualHeight); 

//  inJustDecodeBounds set to false to load the actual bitmap 
    options.inJustDecodeBounds = false; 

//  this options allow android to claim the bitmap memory if it runs low on memory 
    options.inPurgeable = true; 
    options.inInputShareable = true; 
    options.inTempStorage = new byte[16 * 1024]; 

    try { 
//   load the bitmap from its path 
     bmp = BitmapFactory.decodeFile(filePath, options); 
    } catch (OutOfMemoryError exception) { 
     exception.printStackTrace(); 

    } 
    try { 
     scaledBitmap = Bitmap.createBitmap(actualWidth, actualHeight,Bitmap.Config.ARGB_8888); 
    } catch (OutOfMemoryError exception) { 
     exception.printStackTrace(); 
    } 

    float ratioX = actualWidth/(float) options.outWidth; 
    float ratioY = actualHeight/(float) options.outHeight; 
    float middleX = actualWidth/2.0f; 
    float middleY = actualHeight/2.0f; 

    Matrix scaleMatrix = new Matrix(); 
    scaleMatrix.setScale(ratioX, ratioY, middleX, middleY); 

    Canvas canvas = new Canvas(scaledBitmap); 
    canvas.setMatrix(scaleMatrix); 
    canvas.drawBitmap(bmp, middleX - bmp.getWidth()/2, middleY - bmp.getHeight()/2, new Paint(Paint.FILTER_BITMAP_FLAG)); 

//  check the rotation of the image and display it properly 
    ExifInterface exif; 
    try { 
     exif = new ExifInterface(filePath); 

     int orientation = exif.getAttributeInt(
      ExifInterface.TAG_ORIENTATION, 0); 
     Log.d("EXIF", "Exif: " + orientation); 
     Matrix matrix = new Matrix(); 
     if (orientation == 6) { 
     matrix.postRotate(90); 
     Log.d("EXIF", "Exif: " + orientation); 
     } else if (orientation == 3) { 
     matrix.postRotate(180); 
     Log.d("EXIF", "Exif: " + orientation); 
     } else if (orientation == 8) { 
     matrix.postRotate(270); 
     Log.d("EXIF", "Exif: " + orientation); 
     } 
     scaledBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0, 
      scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix, 
      true); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    FileOutputStream out = null; 
    String filename = getFilename(); 
    try { 
     out = new FileOutputStream(filename); 

//   write the compressed bitmap at the destination specified by filename. 
     scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 80, out); 

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

    return filename; 

    } 

    public String getFilename() { 
    File file = new File(Environment.getExternalStorageDirectory().getPath(), "Folderpath"); 
    if (!file.exists()) { 
     file.mkdirs(); 
    } 
    String uriSting = (file.getAbsolutePath() + "/" + "IMG_"+System.currentTimeMillis() + ".png"); 
    return uriSting; 

    } 
    private String getRealPathFromURI(String contentURI) { 
    Uri contentUri = Uri.parse(contentURI); 
    Cursor cursor = getContentResolver().query(contentUri, null, null, null, null); 
    if (cursor == null) { 
     return contentUri.getPath(); 
    } else { 
     cursor.moveToFirst(); 
     int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
     return cursor.getString(index); 
    } 
    } 
    public int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { 
    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if (height > reqHeight || width > reqWidth) { 
     final int heightRatio = Math.round((float) height/ (float) reqHeight); 
     final int widthRatio = Math.round((float) width/(float) reqWidth); 
     inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;  }  final float totalPixels = width * height;  final float totalReqPixelsCap = reqWidth * reqHeight * 2;  while (totalPixels/(inSampleSize * inSampleSize) > totalReqPixelsCap) { 
     inSampleSize++; 
    } 

    return inSampleSize; 
    } 

私は私のコードでacordingこのmImageNewPathに何をも、このアンドロイド6.0 Marashmallow

 public boolean checkPermissionForExternalStorage(){ 
    int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); 
    if (result == PackageManager.PERMISSION_GRANTED){ 
     return true; 
    } else { 
     return false; 
    } 
} 


    if(!checkPermissionForExternalStorage()) 
     { 

     if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)){ 
     Toast.makeText(activity, "External Storage permission needed. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show(); 
    } else { 
     ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE); 
    } 

    } 
+0

ためのランタイムとして許可

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

セットを置く必要がありますか? –

+0

あなたの画像のパス私はすでに画像のパスを取っています....... String mImageNewPath = compressImage(picturePath); mImageNewPathはコモン画像の新しいパスです –

+0

私は自分のコードに追加しますが、決して使用しないでください。申し訳ありませんが、私は実際にコードの初心者ですが、このコード行を追加する必要がありますか? –

関連する問題