2016-07-30 68 views
0

我有一个代码,从图库中选择一个图像,将其设置在ImageView中用作个人资料图片,但是当我加载应用程序时,此代码给出错误,导致图片太大。调整从画廊与毕加索挑选图像

很多人说我用毕加索调整这张照片的大小,但我真的不知道该怎么做,如果有人知道该怎么做,请帮助我,因为我很长时间想做这件事, 。

这是我挑选和存储图片的代码:

@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"/> 

设置也以此为运行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

我应该放什么东西在这个mImageNewPath我的代码acording? –

+0

你的图片路径我已经把你的图片路径....... String mImageNewPath = compressImage(picturePath); mImageNewPath是comress图像的新路径 –

+0

我将它添加到我的代码,但保持从未使用。对不起,但我真的是编码的初学者,我必须添加这行代码? –