Cómo hacer compresión Bitmap sin cambiar el tamaño de mapa de bits?

Estoy usando este método para comprimir la imagen

if(bitmapObject.compress(Bitmap.CompressFormat.PNG, 100, fOut)) { ... } 

Pero esa imagen que obtengo es muy pequeña (en la dimensión) que era antes de la acción comprimida.

Mi aplicación necesita enviar la imagen comprimida a través de la red – por lo que quiero enviar como menos datos que puedo … pero debo mantener el tamaño original de la imagen.

¿Hay alguna otra manera de mantener la dimensión de mapa de bits original con alguna compresa?

¿Estás seguro de que es más pequeño?

 Bitmap original = BitmapFactory.decodeStream(getAssets().open("1024x768.jpg")); ByteArrayOutputStream out = new ByteArrayOutputStream(); original.compress(Bitmap.CompressFormat.PNG, 100, out); Bitmap decoded = BitmapFactory.decodeStream(new ByteArrayInputStream(out.toByteArray())); Log.e("Original dimensions", original.getWidth()+" "+original.getHeight()); Log.e("Compressed dimensions", decoded.getWidth()+" "+decoded.getHeight()); 

Da

 12-07 17:43:36.333: E/Original dimensions(278): 1024 768 12-07 17:43:36.333: E/Compressed dimensions(278): 1024 768 

Tal vez usted obtiene su mapa de bits de un recurso, en cuyo caso la dimensión de mapa de bits dependerá de la densidad de pantalla del teléfono

 Bitmap bitmap=((BitmapDrawable)getResources().getDrawable(R.drawable.img_1024x768)).getBitmap(); Log.e("Dimensions", bitmap.getWidth()+" "+bitmap.getHeight()); 12-07 17:43:38.733: E/Dimensions(278): 768 576 

Si está utilizando formato PNG, entonces no comprimirá su imagen porque PNG es un formato sin pérdidas. Utilice JPEG para comprimir su imagen y utilice 0 en lugar de 100 en calidad.

La calidad acepta 0 – 100

0 = Compresión MAX (Menor calidad que es adecuada para imágenes pequeñas)

100 = Menor Compresión (Calidad MAX que es adecuada para imágenes grandes)

He hecho de esta manera:

Get Bitmap comprimido de la clase Singleton:

 ImageView imageView = (ImageView)findViewById(R.id.imageView); Bitmap bitmap = ImageUtils.getInstant().getCompressedBitmap("Your_Image_Path_Here"); imageView.setImageBitmap(bitmap); 

ImageUtils.java :

 public class ImageUtils { public static ImageUtils mInstant; public static ImageUtils getInstant(){ if(mInstant==null){ mInstant = new ImageUtils(); } return mInstant; } public Bitmap getCompressedBitmap(String imagePath) { float maxHeight = 1920.0f; float maxWidth = 1080.0f; Bitmap scaledBitmap = null; BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; Bitmap bmp = BitmapFactory.decodeFile(imagePath, options); int actualHeight = options.outHeight; int actualWidth = options.outWidth; float imgRatio = (float) actualWidth / (float) actualHeight; float maxRatio = maxWidth / maxHeight; 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; } } options.inSampleSize = calculateInSampleSize(options, actualWidth, actualHeight); options.inJustDecodeBounds = false; options.inDither = false; options.inPurgeable = true; options.inInputShareable = true; options.inTempStorage = new byte[16 * 1024]; try { bmp = BitmapFactory.decodeFile(imagePath, 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)); ExifInterface exif = null; try { exif = new ExifInterface(imagePath); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 0); Matrix matrix = new Matrix(); if (orientation == 6) { matrix.postRotate(90); } else if (orientation == 3) { matrix.postRotate(180); } else if (orientation == 8) { matrix.postRotate(270); } scaledBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix, true); } catch (IOException e) { e.printStackTrace(); } ByteArrayOutputStream out = new ByteArrayOutputStream(); scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 85, out); byte[] byteArray = out.toByteArray(); Bitmap updatedBitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length); return updatedBitmap; } private 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; } } 

Las dimensiones son las mismas después de comprimir Bitmap .

¿Cómo lo comprobé?

 Bitmap beforeBitmap = BitmapFactory.decodeFile("Your_Image_Path_Here"); Log.i("Before Compress Dimension", beforeBitmap.getWidth()+"-"+beforeBitmap.getHeight()); Bitmap afterBitmap = ImageUtils.getInstant().getCompressedBitmap("Your_Image_Path_Here"); Log.i("After Compress Dimension", afterBitmap.getWidth() + "-" + afterBitmap.getHeight()); 

Salida:

 Before Compress : Dimension: 1080-1452 After Compress : Dimension: 1080-1452 

Espero que esto te ayudará.

Creo que utiliza este método para comprimir el mapa de bits

 BitmapFactory.Option imageOpts = new BitmapFactory.Options (); imageOpts.inSampleSize = 2; // for 1/2 the image to be loaded Bitmap thumb = Bitmap.createScaledBitmap (BitmapFactory.decodeFile(photoPath, imageOpts), 96, 96, false); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.