¿Cómo hacer que Bitmap se comprima sin cambiar el tamaño del bitmap?

Yo uso este método para comprimir una imagen

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

Pero la imagen que obtengo es mucho más pequeña (en la dimensión) que estaba antes de la acción de compresión.

Mi aplicación necesita enviar la imagen comprimida a través de la red, por lo que quiero enviar la menor cantidad de datos posible, pero debo mantener el tamaño original de la imagen.

¿Hay alguna otra forma de mantener la dimensión del bitmap original con algo de compresión?

¿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 obtenga su bitmap de un recurso, en cuyo caso la dimensión del bitmap dependerá de la densidad de la 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 usa formato PNG, no comprimirá su imagen porque PNG es un formato sin pérdida. use JPEG para comprimir su imagen y use 0 en lugar de 100 en calidad.

Acepta la calidad 0 – 100

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

100 = Mínima compresión (Calidad MAX que es adecuada para imágenes grandes)

Lo he hecho de esta manera:

Obtener mapa de bits 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 verifiqué?

 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 usas este método para comprimir el bitmap

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