2016-08-24 2 views
0

В моем приложении я собираю изображение, а затем накладываю кадрирование во втором действии, а затем изменяю его размер и отправляю на сервер. Сохраненное изображение выглядит размытым. сохранить изображение с хорошим качеством после resizing.Here мой код:Изображение выглядит размытым после изменения размера до 413 * 531 пикселей в android

PassImageBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Bitmap photo = getIntent().getExtras().getParcelable("image"); 
       resultIv.setImageBitmap(photo); 
       // CALL THIS METHOD TO GET THE URI FROM THE BITMAP 
       Uri tempUri = getImageUri(getApplicationContext(), photo); 
       // CALL THIS METHOD TO GET THE ACTUAL PATH 
       File finalFile = new File(getRealPathFromURI(tempUri)); 
       int x = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 413, getResources().getDisplayMetrics()); 
       int y = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 531, getResources().getDisplayMetrics()); 
       cropView.of(Uri.fromFile(finalFile)).withAspect(x, y).initialize(Image.this); 
      } 
     }); 

      @Override 
      protected Map<String, String> getParams() throws AuthFailureError { 
       //Converting Bitmap to String 
       String image = getStringImage(croppedBitmap);   
       Map<String, String> params = new Hashtable<String, String>(); 
       //Adding parameters 
       params.put(KEY_IMAGE, image);   
       return params; 
      } 

    //resize image 
    public String getStringImage(Bitmap bmp) { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     int width = 413; 
     int height = 531; 
     Bitmap bm = Bitmap.createScaledBitmap(bmp, width, height, false); 
     bm.compress(Bitmap.CompressFormat.PNG, 100, baos); 
     byte[] imageBytes = baos.toByteArray(); 
     String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT); 
     return encodedImage; 
    } 
+0

Попробуйте использовать внешние библиотеки, такие как Picasso или glide для получения сжатого растрового изображения. И послал, что растровое изображение на сервер может решить вашу проблему. – Nivedh

+0

В первую очередь попробуйте «Bitmap.createScaledBitmap (bmp, width, height, true);' (фильтрация ON). BTW, я слишком ленив, чтобы попробовать, что является результатом '(int) TypedValue.applyDimension (TypedValue.COMPLEX_UNIT_PX, 413, getResources(). GetDisplayMetrics());'? И поскольку вы вводите их только как аспектный рацион, вы можете просто сделать 'withAspect (413, 531)' вместо этого. Я бы понял сложное преобразование в случае, если размер физического пикселя (его соотношение сторон) будет скорректирован, но это не так, как x, так и y обрабатываются одинаково. И если вы отрегулируете его на измерение, он позже обманет жесткий шкалу. – Ped7g

+0

В любом случае, чтобы отладить проблему, продолжайте хранить данные sdcard Image (в форме PNG, так что это точная копия без потерь) на каждом этапе обработки (после захвата, после урожая, после масштабирования), чтобы узнать, как изменяется качество пиксельных данных после каждого шага. – Ped7g

ответ

0

Используйте следующий метод сжатия изображения:

public String bitmapToBase64(Bitmap bitmap) { 
     String imageBase64String; 

     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
     bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream); 
     byte[] byteArray = byteArrayOutputStream.toByteArray(); 
     imageBase64String = Base64.encodeToString(byteArray, Base64.DEFAULT); 

     return imageBase64String; 
    } 

декомпилировать:

private Bitmap decodeFile(File f) { 
     try { 
      // decode image size 
      BitmapFactory.Options o = new BitmapFactory.Options(); 
      o.inJustDecodeBounds = true; 
      BitmapFactory.decodeStream(new FileInputStream(f), null, o); 

      // Find the correct scale value. It should be the power of 2. 
      final int REQUIRED_SIZE = 512; 
      int width_tmp = o.outWidth, height_tmp = o.outHeight; 
      int scale = 1; 
      while (true) { 
       if (width_tmp/2 < REQUIRED_SIZE || height_tmp/2 < REQUIRED_SIZE) 
        break; 
       width_tmp /= 2; 
       height_tmp /= 2; 
       scale *= 2; 
      } 

      // decode with inSampleSize 
      BitmapFactory.Options o2 = new BitmapFactory.Options(); 
      o2.inSampleSize = scale; 
      return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
     } catch (FileNotFoundException e) { 
     } 
     return null; 
    } 
+0

Где я должен использовать изменение размера изображения, если я использую это? Я хочу сохранить изображение 413 * 531 пикселей на сервере. – Amshu

+0

Вы получаете путь изображения после обрезки изображения, декодируете этот путь к растровому изображению и используете этот метод сжатия перед отправкой его на сервер. – Nidhi

+0

В моем коде также используется метод сжатия. Если я не изменю размер, я не получаю желаемый результат. Так я использовал Bitmap bm = Bitmap.createScaledBitmap (bmp, width, height, false); iside getStringImage (битмап bmp). – Amshu

Смежные вопросы