2015-09-26 2 views
1

Я работаю в приложении, которое снимает изображение из галереи и сохраняет его в синтаксическом анализе.imageize image selected from gallery

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

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

Это мой код в этот момент

public class Datos extends Activity implements OnItemSelectedListener { 


private final int SELECT_PHOTO = 1; 
private ImageButton imageView; 


ParseFile file; 
byte [] data; 

/* 
    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; 
    } 
*/ 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.activity_datos); 
    btnClick(); 

    imageView = (ImageButton) findViewById(R.id.imageButton); 


    ImageButton pickImage = (ImageButton) findViewById(R.id.imageButton); 
    pickImage.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View view) { 
      Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); 
      photoPickerIntent.setType("image/*"); 
      //photoPickerIntent.putExtra("outputX", 150); 
      //photoPickerIntent.putExtra("outputY", 100); 
      //photoPickerIntent.putExtra("aspectX", 1); 
      //photoPickerIntent.putExtra("aspectY", 1); 
      //photoPickerIntent.putExtra("scale", true); 
      startActivityForResult(photoPickerIntent, SELECT_PHOTO); 
     } 
    }); 

} 

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


    switch (requestCode) { 
     case SELECT_PHOTO: 
      if (resultCode == RESULT_OK) { 
       try { 
        Uri imageUri = imageReturnedIntent.getData(); 
        InputStream imageStream = getContentResolver().openInputStream(imageUri); 
        Bitmap selectedImage = BitmapFactory.decodeStream(imageStream); 
        imageView.setImageBitmap(selectedImage); 

        ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
        selectedImage.compress(Bitmap.CompressFormat.PNG, 100, stream); 

        data = stream.toByteArray(); 

        BitmapDrawable bitmapDrawable = new BitmapDrawable(getResources(), selectedImage); 
        imageView.setBackgroundDrawable(bitmapDrawable); 

        BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable(); 
        Bitmap bmp = drawable.getBitmap(); 
        Bitmap b = Bitmap.createScaledBitmap(bmp, 120, 120, false); 


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


      } 

    } 
} 



@Override 
public void onItemSelected(AdapterView<?> parent, View v, int position, 
          long id) { 
    // TODO Auto-generated method stub 

    Spinner spinner = (Spinner) parent; 
    if (spinner.getId() == R.id.telefono) { 
     consola = parent.getItemAtPosition(position).toString(); 
    } else if (spinner.getId() == R.id.provincia) { 
     provincia = parent.getItemAtPosition(position).toString(); 
    } 

} 

@Override 
public void onNothingSelected(AdapterView<?> arg0) { 
    // TODO Auto-generated method stub 
} 


public void btnClick() { 

    Button buttonEnviar = (Button) findViewById(R.id.enviar); 


    buttonEnviar.setOnClickListener(new OnClickListener() { 


     @Override 
     public void onClick(View arg0) { 

      //Storing image in parse passed in onclick method of a button with the below code: 


      Intent intentDatos = new Intent(Datos.this, Inicio.class); 
      startActivity(intentDatos); 


      ParseObject testObject = new ParseObject("Musica"); 

      if (data != null) { 

       file = new ParseFile("selected.png", data); 
      } 

      else { 

       data = "".getBytes(); 
       file = new ParseFile("selected.png", data); 
      } 

      //file.saveInBackground(); 


      testObject.put("imagen", file); 

      testObject.saveInBackground(); 




     } 
    }); 


} 

Кто-нибудь знает, как это сделать?

Спасибо за вашу помощь,

+0

возможно дубликат [Уменьшить размер растрового изображения до некоторой указанного пикселя в Android] (Http: // StackOverflow .com/questions/15759195/reduce-size-of-bitmap-to-some-defined-pixel-in-android) –

ответ

9

This answer поможет вам

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

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

изменить ваш onActivityResult в SELECT_PHOTO случае, как это:

case SELECT_PHOTO: 
     if (resultCode == RESULT_OK) { 
      try { 
       Uri imageUri = imageReturnedIntent.getData(); 
       InputStream imageStream = getContentResolver().openInputStream(imageUri); 
       Bitmap selectedImage = BitmapFactory.decodeStream(imageStream); 

       selectedImage = getResizedBitmap(selectedImage, 400);// 400 is for example, replace with desired size 

       imageView.setImageBitmap(selectedImage); 


      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 
     } 
+0

Привет, Рахул, спасибо за ваш ответ, но проблема в том, что я точно не знаю, где использовать эту часть кода. Я пытался, но это не сработало. Появится сообщение «getResizeBitmap» с сообщением, которое никогда не использовалось. Не могли бы вы помочь мне с этим или отправить мне пример о том, как использовать этот код? Я искал. – Rec

+0

@Rec проверить обновленный ответ на использование функции –

+0

Привет, Рахул, спасибо, он отлично работал, – Rec