2016-07-30 2 views
0

У меня есть код, который выбирает изображение из галереи, установите его в ImageView для использования в качестве изображения профиля, но этот код дает ошибку при загрузке приложения, потому что изображение слишком велико.Изменить размер выбранного изображения из галереи с помощью Picasso

Так много людей сказали мне использовать Picasso для изменения размера этой фотографии, но я действительно не знаю, как это сделать, если кто-то знает, как это сделать, пожалуйста, помогите мне, потому что я так долго пытаюсь это сделать, и я не могу ,

это код, который я выбрать и сохранить изображение:

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

Разрешение

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

Set также это как среда для андроид 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

, что я должен поставить в этом mImageNewPath acording с моим кодом? –

+0

Ваш путь к картинке Я ​​уже принимаю ваш путь изображения ....... Строка mImageNewPath = compressImage (picturePath); mImageNewPath - новый путь к картинке –

+0

Я добавлю его в свой код, но останусь как никогда. извините, но я действительно новичок в кодировании, где я должен добавить эту строку кода? –

Смежные вопросы