2017-02-07 11 views
0

У меня есть эта небольшая проблема. Я хочу сделать снимок с моей камерой. После этого я хотел бы сохранить его на 640 x 640 пикселей. Таким образом, я уменьшаю размер изображения от 5 МБ до 300 - 500 КБ или меньше, но когда я снимаю изображение с камеры, он сохраняет мое внешнее хранилище, но никогда не преобразует его в 640 х 640. Я получаю исходный размер изображения то есть около 4k разрешения.Изменение размера растрового изображения не работает

Целью является сохранение внутри растрового изображения изображения 640 x 640, но не оригинального размера.

Это код

public class MainActivity extends AppCompatActivity { 

    private static final String LOG_TAG = MainActivity.class.getSimpleName(); 

    private static final int CAMERA_REQUEST_CODE = 1; 

    Button mBtnCamera; 

    private Uri imageUri = null; 

    int aleatorio; 
    String foto; 

    ImageView mImageView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mImageView = (ImageView) findViewById(R.id.imageView); 

     aleatorio = Double.valueOf(Math.random() * 100).intValue(); 

     foto = Environment.getExternalStorageDirectory() + "/imagen" + aleatorio + ".jpg"; 

     mBtnCamera = (Button) findViewById(R.id.btnCamera); 

     mBtnCamera.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       cameraIntent(); 
      } 
     }); 

    } 

    private void cameraIntent() { 

     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

     imageUri = Uri.fromFile(new File(foto)); 

     takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 

     startActivityForResult(takePictureIntent, CAMERA_REQUEST_CODE); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (requestCode == CAMERA_REQUEST_CODE && resultCode == RESULT_OK) { 

      Bitmap image = BitmapFactory.decodeFile(foto); 

      Bitmap resizedBitmap = Bitmap.createScaledBitmap(
        image, 640, 640, false); 

      File f = new File(foto); 

      long size = f.length(); 

      Toast.makeText(this, size/(1024 * 1024) + " MB, " + f.getAbsolutePath(), Toast.LENGTH_LONG).show(); 

      mImageView.setImageBitmap(resizedBitmap); 

     } 
    } 

    public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight) { 
     int width = bm.getWidth(); 
     int height = bm.getHeight(); 
     float scaleWidth = ((float) newWidth)/width; 
     float scaleHeight = ((float) newHeight)/height; 
     // CREATE A MATRIX FOR THE MANIPULATION 
     Matrix matrix = new Matrix(); 
     // RESIZE THE BIT MAP 
     matrix.postScale(scaleWidth, scaleHeight); 

     // "RECREATE" THE NEW BITMAP 
     Bitmap resizedBitmap = Bitmap.createBitmap(
       bm, 0, 0, width, height, matrix, false); 
     bm.recycle(); 
     return resizedBitmap; 
    } 

благодаря

+1

вы никогда не экономите малоформатные растровый – tyczj

ответ

0

Ваш объект resizedBitmap существует в памяти только в этой ситуации. Вы должны записать этот объект в хранилище.

Посмотрите на этом решении:

MainActivity.java:

package szilard.sebok.myapplication; 

import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Matrix; 
import android.net.Uri; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.FrameLayout; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 

public class MainActivity extends AppCompatActivity { 

    private static final String LOG_TAG = MainActivity.class.getSimpleName(); 

    private static final int CAMERA_REQUEST_CODE = 1; 

    Button mBtnCamera; 

    private Uri imageUri = null; 

    int aleatorio; 
    String foto; 

    ImageView mImageView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mImageView = (ImageView) findViewById(R.id.imageView); 

     aleatorio = Double.valueOf(Math.random() * 100).intValue(); 

     foto = Environment.getExternalStorageDirectory() + "/imagen" + aleatorio + ".jpg"; 

     mBtnCamera = (Button) findViewById(R.id.btnCamera); 

     mBtnCamera.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       cameraIntent(); 
      } 
     }); 

    } 

    private void cameraIntent() { 

     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

     imageUri = Uri.fromFile(new File(foto)); 

     takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 

     startActivityForResult(takePictureIntent, CAMERA_REQUEST_CODE); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (requestCode == CAMERA_REQUEST_CODE && resultCode == RESULT_OK) { 

      Bitmap image = BitmapFactory.decodeFile(foto); 

      Bitmap resizedBitmap = Bitmap.createScaledBitmap(image, 640, 640, false); 
      //Lets create a new file for resizedBitmap 
      // getExternalMediaDirs()[0].getPath() -> your first external media dir 
      // and adding the file name for that: ...mediadir + /filename.png 
      File resizedPng = new File(getExternalMediaDirs()[0].getPath() + "/resizedPng.png"); 
      try { 
       //For testing I delete that if its exist 
       if (resizedPng.exists()) { 
        resizedPng.delete(); 
       } 
       if (resizedPng.createNewFile()) { 
        //Try to write the resizedBitmap object to the path 
        boolean successfullWrite = writeResizedBitmapToFile(resizedBitmap, resizedPng.getPath()); 
        if (successfullWrite) { 
         boolean deleted = tryToDeleOriginal(foto); 
         Toast.makeText(this, "WIN! Find your picture at: " + resizedPng.getPath() + "and is the original deleted? :" +String.valueOf(deleted), Toast.LENGTH_LONG).show(); 
        } else { 
         Toast.makeText(this, "Fail :(", Toast.LENGTH_LONG).show(); 
        } 
       } 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    public boolean tryToDeleOriginal(String pathToOriginal){ 
     File f = new File (pathToOriginal); 
     if (!f.isDirectory()){ 
      if (f.exists()){ 
       return f.delete(); 
      } 
     } 
     return false; 
    } 
    //This one is from the post that I linked before 
    public boolean writeResizedBitmapToFile(Bitmap bmp, String filePath) { 
     FileOutputStream out = null; 
     try { 
      out = new FileOutputStream(filePath); 
      bmp.compress(Bitmap.CompressFormat.PNG, 100, out); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       if (out != null) { 
        out.close(); 
        return true; 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return false; 
    } 

    public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight) { 
     int width = bm.getWidth(); 
     int height = bm.getHeight(); 
     float scaleWidth = ((float) newWidth)/width; 
     float scaleHeight = ((float) newHeight)/height; 
     // CREATE A MATRIX FOR THE MANIPULATION 
     Matrix matrix = new Matrix(); 
     // RESIZE THE BIT MAP 
     matrix.postScale(scaleWidth, scaleHeight); 

     // "RECREATE" THE NEW BITMAP 
     Bitmap resizedBitmap = Bitmap.createBitmap(
       bm, 0, 0, width, height, matrix, false); 
     bm.recycle(); 
     return resizedBitmap; 
    } 
} 

Не забудьте permessions на манифесте, добавьте этот:

<uses-permission android:name="android.permission.CAMERA"/> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
+0

Спасибо, что ответили на этот вопрос. Пожалуйста, подумайте над улучшением ответа, предоставив некоторое объяснение и код, основанный на ресурсе, с которым вы связались! – RedBassett

+0

Спасибо за отзыв. Я новичок в ответ, пишущий здесь (это был мой первый). В следующий раз я приложу некоторый код, если эта проблема требует. –

+0

спасибо за ответ, если я это сделаю, мне нужно сохранить исходное изображение, а затем использовать его снова, изменить размер и сохранить размер? –