2016-07-30 11 views
0

Ich habe einen Code, der ein Bild aus der Galerie nimmt, setzen Sie ihn in einem Image für die Verwendung als Profilbild, aber dieser Code gibt Fehler, wenn ich die App geladen werden bewirken, dass das Bild zu groß ist.ein aufgenommenes Bild aus der Galerie mit Picasso

So viele Leute sagten mir, dass ich den Picasso benutzen sollte, um das ausgewählte Bild zu verkleinern, aber ich weiß wirklich nicht, wie es geht. Wenn jemand weiß, wie es geht, bitte hilf mir, weil ich so lange versuche, es zu tun .

Dies ist der Code, dass ich das Bild auswählen und speichern:

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


} 

Antwort

0

zuerst Ihren Weg nehmen und die Funktion

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


} 

Funktion aufrufen Größe zu reduzieren, ohne diese Qualität nimmt Loosing in Klasse kopieren Sie einfach in die Klasse

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

Permission

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

Set dies auch als Laufzeit für Android 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

was soll ich in diesem mImageNewPath mit meinem Code Acording setzen? –

+0

Ihr Bilderpfad Ich nehme schon Ihren Bildweg ....... String mImageNewPath = compressImage (BildPfad); mImageNewPath ist neuer Weg der comress Bild –

+0

ich es zu meinem Code hinzufügen, sondern bleiben wie nie benutzt. Entschuldigung, aber ich bin wirklich ein Anfänger in der Programmierung, wo ich diese Codezeile hinzufügen muss? –

Verwandte Themen