2013-06-06 16 views
7

Chcę zmniejszyć rozmiar bitmapy do 200kb dokładnie. Otrzymuję obraz z sdcard, kompresuję go i zapisuję go na sdcard ponownie pod inną nazwą w innym katalogu. Kompresja działa dobrze (obraz o wielkości 3 mb jest skompresowany do około 100 kb). Pisałem następujące linie kodów do tego:Zmniejsz rozmiar bitmapy do określonego rozmiaru w Androidzie

String imagefile ="/sdcard/DCIM/100ANDRO/DSC_0530.jpg"; 
Bitmap bm = ShrinkBitmap(imagefile, 300, 300); 

//this method compresses the image and saves into a location in sdcard 
    Bitmap ShrinkBitmap(String file, int width, int height){ 

     BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options(); 
      bmpFactoryOptions.inJustDecodeBounds = true; 
      Bitmap bitmap = BitmapFactory.decodeFile(file, bmpFactoryOptions); 

      int heightRatio = (int)Math.ceil(bmpFactoryOptions.outHeight/(float)height); 
      int widthRatio = (int)Math.ceil(bmpFactoryOptions.outWidth/(float)width); 

      if (heightRatio > 1 || widthRatio > 1) 
      { 
      if (heightRatio > widthRatio) 
      { 
       bmpFactoryOptions.inSampleSize = heightRatio; 
      } else { 
       bmpFactoryOptions.inSampleSize = widthRatio; 
      } 
      } 

      bmpFactoryOptions.inJustDecodeBounds = false; 
      bitmap = BitmapFactory.decodeFile(file, bmpFactoryOptions); 

      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
      byte[] imageInByte = stream.toByteArray(); 
      //this gives the size of the compressed image in kb 
      long lengthbmp = imageInByte.length/1024; 

      try { 
       bitmap.compress(CompressFormat.JPEG, 100, new FileOutputStream("/sdcard/mediaAppPhotos/compressed_new.jpg")); 
      } catch (FileNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 


     return bitmap; 
     } 
+0

zmiana szerokość i wysokość tego obrazu .. – Riser

+0

chcesz zrobić obraz 200x200? – TharakaNirmana

+0

tak, jak chcesz 200kb ... spróbuj, aż otrzymasz swój wynik .. – Riser

Odpowiedz

16

znalazłem odpowiedź, która działa idealnie dla mnie:

/** 
    * reduces the size of the image 
    * @param image 
    * @param maxSize 
    * @return 
    */ 
    public Bitmap getResizedBitmap(Bitmap image, int maxSize) { 
     int width = image.getWidth(); 
     int height = image.getHeight(); 

     float bitmapRatio = (float)width/(float) height; 
     if (bitmapRatio > 1) { 
      width = maxSize; 
      height = (int) (width/bitmapRatio); 
     } else { 
      height = maxSize; 
      width = (int) (height * bitmapRatio); 
     } 
     return Bitmap.createScaledBitmap(image, width, height, true); 
    } 

wywołanie metody:

Bitmap converetdImage = getResizedBitmap(photo, 500); 
  • zdjęcie jest twój bitmapa
+0

Ta funkcja zmniejszy rozmiar bitmapy, jeśli jest większa, ale co z mniejszymi bitmapami. Czy zostaną one powiększone zgodnie ze specyfikacją? – NarendraJi

+0

Dlaczego to jest czarna bitmapa? – Sermilion

+1

@TharakaNirmana co to jest MaxSize? w twoim wywołaniu metody jest 500, 500 kb lub 500 mb? – TheQ

Powiązane problemy