2016-12-08 3 views
0

Я беру изображение с камеры. Размер захваченного изображения слишком мал при захвате. Но позже, если я зарегистрирую галерею, размер захваченного изображения отображается в МБ.Захваченное изображение возвращает небольшой размер

Я попытался отладить код, поэтому во время отладки я проверил длину файла после захвата изображения, длина показывает 26956 байт, а когда я проверил то же изображение в галерее, размер изображения составляет 1,3 МБ.

Почему размер изображения уменьшается при захвате?

 private void cameraIntent() { 

     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     startActivityForResult(intent, REQUEST_CAMERA); 

    } 

    private void onCaptureImageResult(Intent data) { 

     Bitmap thumbnail = (Bitmap) data.getExtras().get("data"); 
     ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 

(thumbnail.getWidth()/2),(int)(thumbnail.getHeight()/2),true); 

     thumbnail.compress(Bitmap.CompressFormat.PNG, 100, bytes); 
     File destination = new File(Environment.getExternalStorageDirectory(), 
       System.currentTimeMillis() + ".png"); 

     FileOutputStream fo; 
     try { 
      destination.createNewFile(); 
      fo = new FileOutputStream(destination); 
      fo.write(bytes.toByteArray()); 
      fo.close(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     long size = destination.length();// here size of the image is too small 

     selectFile = false; 

     loadImageFromFile(destination.getAbsolutePath()); 

    } 


     public void loadImageFromFile(String imageFile) { 

     try { 
      ExifInterface ei = new ExifInterface(imageFile); 
      int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, 
        ExifInterface.ORIENTATION_UNDEFINED); 

      Bitmap bitmap = BitmapFactory.decodeFile(imageFile); 

      Bitmap rotatedBitmap = null; 

      switch (orientation) { 
       case ExifInterface.ORIENTATION_ROTATE_90: 
        rotatedBitmap = rotateImage(bitmap, 90); 
        break; 
       case ExifInterface.ORIENTATION_ROTATE_180: 
        rotatedBitmap = rotateImage(bitmap, 180); 
        break; 
       case ExifInterface.ORIENTATION_ROTATE_270: 
        rotatedBitmap = rotateImage(bitmap, 270); 
        break; 
       case ExifInterface.ORIENTATION_NORMAL: 
        rotatedBitmap = bitmap; 
        break; 
       default: 
        rotatedBitmap = bitmap; 
        break; 
      } 

      if (rotatedBitmap != null) { 

       if (selectFile && fileSizeInKB > 500) { 
        rotatedBitmap = Bitmap.createScaledBitmap(rotatedBitmap, (int) (rotatedBitmap.getWidth() * 0.3), (int) (rotatedBitmap.getHeight() * 0.3), true); 
       } 

       else if(selectFile && fileSizeInKB > 1024){ 

        rotatedBitmap = Bitmap.createScaledBitmap(rotatedBitmap, (int) (rotatedBitmap.getWidth() * 0.2), (int) (rotatedBitmap.getHeight() * 0.2), true); 
       } 
       else if(selectFile && fileSizeInMB > 2){ 

        rotatedBitmap = Bitmap.createScaledBitmap(rotatedBitmap, (int) (rotatedBitmap.getWidth() * 0.1), (int) (rotatedBitmap.getHeight() * 0.1), true); 
       } 

       profileImageView.setImageBitmap(rotatedBitmap); 
       selectedBitmap = rotatedBitmap; 

       ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
       selectedBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); //replace 100 with desired quality percentage. 
       byte[] byteArray = stream.toByteArray(); 

       File tempFile = File.createTempFile("temp", null, getCacheDir()); 
       FileOutputStream fos = new FileOutputStream(tempFile); 
       fos.write(byteArray); 

       Long size = tempFile.length(); 

       profileImage = tempFile; 
      } 

     } catch (IOException ex) { 

     } 
    } 

Я масштабирование изображения, выбранное из галереи, я тоже хочу, чтобы масштабировать изображения, полученные с камеры, но размер изображения я не получаю необходимости.

Может ли кто-нибудь помочь в этом, пожалуйста? Спасибо ...

Edit:

 private void cameraIntent() { 

     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     if (intent.resolveActivity(getPackageManager()) != null) { 
      // Create the File where the photo should go 

      try { 
       photoFile = createImageFile(); 
      } catch (IOException ex) { 

      } 
      // Continue only if the File was successfully created 
      if (photoFile != null) { 
       intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); 
       startActivityForResult(intent, REQUEST_CAMERA); 
      } 
     } 

    } 



    private File createImageFile() throws IOException { 
     // Create an image file name 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     String imageFileName = "image"; 
     File storageDir = Environment.getExternalStoragePublicDirectory(
       Environment.DIRECTORY_PICTURES); 
     File image = File.createTempFile(
       imageFileName, /* prefix */ 
       ".jpg",   /* suffix */ 
       storageDir  /* directory */ 
     ); 

     // Save a file: path for use with ACTION_VIEW intents 
     fileName = image.getAbsolutePath(); 
     return image; 
    } 

    private void onCaptureImageResult(Uri data) { 

     try { 

      Bitmap thumbnail = MediaStore.Images.Media.getBitmap(this.getContentResolver(), data); 


      selectFile = false; 

      long fileSizeInBytes = photoFile.length(); 
// Convert the bytes to Kilobytes (1 KB = 1024 Bytes) 
      fileSizeInKB = fileSizeInBytes/1024; 
// Convert the KB to MegaBytes (1 MB = 1024 KBytes) 
      fileSizeInMB = fileSizeInKB/1024; 

      loadImageFromFile(photoFile.getAbsolutePath()); 

     }catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

public void loadImageFromFile(String imageFile) { 

    try { 
     ExifInterface ei = new ExifInterface(imageFile); 
     int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, 
       ExifInterface.ORIENTATION_UNDEFINED); 

     Bitmap bitmap = BitmapFactory.decodeFile(imageFile); 

     Bitmap rotatedBitmap = null; 

     switch (orientation) { 
      case ExifInterface.ORIENTATION_ROTATE_90: 
       rotatedBitmap = rotateImage(bitmap, 90); 
       break; 
      case ExifInterface.ORIENTATION_ROTATE_180: 
       rotatedBitmap = rotateImage(bitmap, 180); 
       break; 
      case ExifInterface.ORIENTATION_ROTATE_270: 
       rotatedBitmap = rotateImage(bitmap, 270); 
       break; 
      case ExifInterface.ORIENTATION_NORMAL: 
       rotatedBitmap = bitmap; 
       break; 
      default: 
       rotatedBitmap = bitmap; 
       break; 
     } 

     if (rotatedBitmap != null) { 
      // 

      if (selectFile && fileSizeInMB < 1 && fileSizeInKB > 500) { 
       rotatedBitmap = Bitmap.createScaledBitmap(rotatedBitmap, (int) (rotatedBitmap.getWidth() * 0.9), (int) (rotatedBitmap.getHeight() * 0.9), true); 
      } 

      else if(selectFile && fileSizeInMB < 2){ 

       rotatedBitmap = Bitmap.createScaledBitmap(rotatedBitmap, (int) (rotatedBitmap.getWidth() * 0.3), (int) (rotatedBitmap.getHeight() * 0.3), true); 
      } 
      else if(selectFile && fileSizeInMB > 2){ 

       rotatedBitmap = Bitmap.createScaledBitmap(rotatedBitmap, (int) (rotatedBitmap.getWidth() * 0.2), (int) (rotatedBitmap.getHeight() * 0.2), true); 
      } 
      else if(selectFile && fileSizeInMB > 3){ 

       rotatedBitmap = Bitmap.createScaledBitmap(rotatedBitmap, (int) (rotatedBitmap.getWidth() * 0.1), (int) (rotatedBitmap.getHeight() * 0.1), true); 
      } 
      // resize(rotatedBitmap,bitmap.getWidth()/2,bitmap.getHeight()/2); 

      profileImageView.setImageBitmap(rotatedBitmap); 
      selectedBitmap = rotatedBitmap; 

      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
      selectedBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); //replace 100 with desired quality percentage. 
      byte[] byteArray = stream.toByteArray(); 

      File tempFile = File.createTempFile("temp", null, getCacheDir()); 
      FileOutputStream fos = new FileOutputStream(tempFile); 
      fos.write(byteArray); 

      Long size = tempFile.length(); 

      profileImage = tempFile; 
     } 

    } catch (IOException ex) { 
     // UiUtils.showAlert(getString(R.string.error),NewGroupAcvitity.this); 
    } 
} 

Теперь с этим кодом, когда я захватить изображение после захвата требуется время, чтобы загрузить на просмотр изображения и показать пустой экран, пока изображение устанавливается изображение Посмотреть.

+0

вы сжимаете ваш растровое –

+0

где? @VivekMishra – Sid

+0

Здесь 'thumbnail.compress (Bitmap.CompressFormat.PNG, 100, байты);' –

ответ

3

Вы используете Thumbnail вместо фактического изображения.

Чтобы получить реальное изображение, вы должны передать файл изображения URI намерению камеры, как MediaStore.EXTRA_OUTPUT

образца:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);//photoURI - file uri where you want the image to be saved 
startActivityForResult(intent, REQUEST_CAMERA); 

См https://developer.android.com/training/camera/photobasics.html#TaskPath для необходимых шагов и полного кода.


Чтобы получить уменьшенную Bitmap от пути к файлу

int targetW = 800; 
    int targetH = 1000; 

    // Get the dimensions of the bitmap 
    BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
    bmOptions.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(imagePath, bmOptions); 
    int photoW = bmOptions.outWidth; 
    int photoH = bmOptions.outHeight; 

    int scaleFactor = Math.min(photoW/targetW, photoH/targetH); 

    // Decode the image file into a Bitmap 
    bmOptions.inJustDecodeBounds = false; 
    bmOptions.inSampleSize = scaleFactor; 
    bmOptions.inPurgeable = true; 

    Bitmap bitmap = BitmapFactory.decodeFile(imagePath, bmOptions); 
+0

откуда пройти uri? в каком методе? – Sid

+0

Вы проверили ссылку, о которой я упоминал? –

+0

Пройдите страницу обучения Google, но если вы найдете какие-либо трудности, отправьте ее здесь. –

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