Comprimir imagenes

479 views
Skip to first unread message

Luis Antonio Garcia Perrusquia

unread,
Mar 11, 2016, 11:07:53 AM3/11/16
to desarrollad...@googlegroups.com
Hola, soy novato en android y ando quierendo hacer una aplicacion en donde tome imagen de la camara la guarde en la memoria interna o en una memoria externa de un dispositivo, obtenga una foto ya existente de la galeria y la muestre en pantalla en un textView, ahora bien una vez que esta mostrada dicha foto o imagen quiero comprimir dicha imagen.

Les agradeceria mucho que explicacen un poco los metodos que me pasen por favor.

ALGUIEN ME PUEDE AYUDAR POR FAVOR!!!

De ante mano muchas gracias a todos SALUDOS!

David Alonso

unread,
Mar 11, 2016, 11:26:57 AM3/11/16
to desarrollad...@googlegroups.com
Buenas quizás te sirva este ejemplo ; lo que hace es guardar una imagen en un servidor usando php y guarda la ruta de la imagen en una db Mysql. 



En la clase MainActivity del ejemplo se encuentra este método :


public String getStringImage(Bitmap bmp){
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        byte[] imageBytes = baos.toByteArray();
        String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);
        return encodedImage;
    }

Ese método comprime la imagen ; en esta linea puedes modificar la compresión (Valor 100 lo puedes disminuir) :

bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);

Saludos

--
Para participar es necesario que leas detenidamente las normas del grupo: https://goo.gl/xeTRQm
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/desarrolladores-android.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/desarrolladores-android/CAMRhrXoV8zHD2o%2BDCrsnR%3D0Hx_Wdoo9py%3DX29WAqeLVaSunNVQ%40mail.gmail.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Luis Antonio Garcia Perrusquia

unread,
Mar 11, 2016, 6:58:56 PM3/11/16
to desarrollad...@googlegroups.com
Hola David Alonso, muchas gracias por contestar, tengo ya un desarrollo en donde obtengo la imagen te lo comparto:

Varibales y constatntes que ocupo:
private String APP_DIRECTORY = "myPictureApp/";
private String MEDIA_DIRECTORY = APP_DIRECTORY + "media";
private String TEMPORAL_PICTURE_NAME = "temporal.jpg";

private final int PHOTO_CODE = 100;
private final int SELECT_PICTURE_NAME = 200;


ImageView imageView;
Button btnFoto;
Bitmap bmp;

Metodo en donde incializo mi boton y el imageView:
public void init(){
imageView = (ImageView)findViewById(R.id.setPicture);
btnFoto = (Button)findViewById(R.id.btnFoto);
btnFoto.setOnClickListener(this);
}

Ahora bien tengo un onclick con un CharSequence
switch (id){
case R.id.btnFoto:
final CharSequence[] options = {
"Tomar foto",
"Seleccionar de galeria",
"Cancelar"
};

final AlertDialog.Builder buldier = new AlertDialog.Builder(MainActivity.this);
buldier.setTitle("Selecciona una opcion");

buldier.setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int NumSelect) {

if (options[NumSelect] == "Tomar foto"){
openCamera();

} else if (options[NumSelect] == "Seleccionar de galeria") {
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
startActivityForResult(intent.createChooser(intent, "Selecciona la app de la imagen"), SELECT_PICTURE_NAME);

} else if (options[NumSelect] == "Cancelar") {
dialog.dismiss();
}//Fin del if

}//Fin del onclick dialog

});//Fin del setItems

buldier.show();//Para que se pueda muestra nuestro menu
break;
}//FIn del switch
}//Fin del onclick

Mi metodo para abrir la camara:
private void openCamera() {
File file = new File(Environment.getExternalStorageDirectory(), MEDIA_DIRECTORY);
file.mkdirs();

String path = Environment.getExternalStorageDirectory() + File.separator
+ MEDIA_DIRECTORY + File.separator + TEMPORAL_PICTURE_NAME;

File newFile = new File(path);

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(newFile));
startActivityForResult(intent, PHOTO_CODE);
}

El activity for Result para que escuche la respuestas:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

switch (requestCode){
case PHOTO_CODE:
if(resultCode == RESULT_OK){
String dir = Environment.getExternalStorageDirectory() + File.separator
+ MEDIA_DIRECTORY + File.separator + TEMPORAL_PICTURE_NAME;
decodeBitmap(dir);
}
break;

case SELECT_PICTURE_NAME:
if(resultCode == RESULT_OK){
Uri path = data.getData();
imageView.setImageURI(path);
}
}
}

Y en donde decodifico el Bitmap para agregarlo al ImageView
private void decodeBitmap(String dir){
bmp = BitmapFactory.decodeFile(dir);
imageView.setImageBitmap(bmp);
}

¿Este codigo que yo tire esta bien echo?
Este codigo solo guarda en una memoria externa, e buscado peor no e encotrado nada concreto, como puedo guardar en memoria interna?
El metodo que me comentas lo tengo que meter en un nuevo boton, no se que se llame Comprimir imagen? el debe llevar un activity forresult?

Perdona o perdonen tantas preguntas

MUCHAS GRACIAS POR CONTESTAR

David Alonso

unread,
Mar 11, 2016, 8:28:52 PM3/11/16
to desarrollad...@googlegroups.com
Revisando el avance que tienes te podría recomendar que el método que tienes :
private void decodeBitmap(String dir)

Lo modifiques para que te permita usarlo en el switch que tienes en su método : 
protected void onActivityResult
ya que hasta donde pude apreciar en esta parte case SELECT_PICTURE_NAME: no lo esta usando. 

Te recomendaria que al momento de guardar la imagen realices la compresión ; te adjunto algunas paginas donde muestran como almacenar una imagen en la memoria interna :

http://stackoverflow.com/questions/17674634/saving-and-reading-bitmaps-images-from-internal-memory-in-android
http://www.resolvinghere.com/sof/12352991.shtml

Ademas en la version de android lollipop ha cambiado un poco el API de la Camara al momento de lanzar el intent puede revisarlo en:

http://stackoverflow.com/questions/29778467/camera-image-capture-does-not-return-data-on-some-devices
https://developer.android.com/intl/es/training/camera/photobasics.html#TaskCaptureIntent

Saludos



Luis Antonio Garcia Perrusquia

unread,
Mar 14, 2016, 11:12:59 AM3/14/16
to desarrollad...@googlegroups.com

Luis Antonio Garcia Perrusquia

unread,
Mar 14, 2016, 3:10:56 PM3/14/16
to desarrollad...@googlegroups.com
Hola David, estuve leyendo y aplicando algunas cosas con base en lo que me mandaste, escalar la imagen obtenida de la camara con el siguiente codigo:
private void scaleImage()
{
// Obtener el ImageView y su mapa de bits
ImageView view = (ImageView) findViewById(R.id.imagen);
Drawable drawing = view.getDrawable();
if (drawing == null) {
return; // Checking for null & return, as suggested in comments
}
Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();

// Obtener las dimensiones actuales y la caja de unión deseada
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int bounding = dpToPx(400);
Log.i("Test", "original width = " + Integer.toString(width));
Log.i("Test", "original height = " + Integer.toString(height));
Log.i("Test", "bounding = " + Integer.toString(bounding));
txtTest.setText("Original Width: " + width + "\n" + "Original Height: " + height);


//Determinar la cantidad de escala : la dimensión que requiere menos de escala es
// Más cerca de la de sus lados. De esta manera la imagen se mantiene siempre dentro de su
// Cuadro delimitador y sea x / y eje de la toca .
float xScale = ((float) bounding) / width;
float yScale = ((float) bounding) / height;
float scale = (xScale <= yScale) ? xScale : yScale;
Log.i("Test", "xScale = " + Float.toString(xScale));
Log.i("Test", "yScale = " + Float.toString(yScale));
Log.i("Test", "scale = " + Float.toString(scale));

// Crear una matriz para el escalado y añadir los datos de escala
Matrix matrix = new Matrix();
matrix.postScale(scale, scale);


bmp = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
width = bmp.getWidth();
height = bmp.getHeight();
BitmapDrawable result = new BitmapDrawable(bmp);
Log.i("Test", "scaled width = " + Integer.toString(width));
Log.i("Test", "scaled height = " + Integer.toString(height));
txtTest1.setText("Scale width: " + width + "\n" + "Scale height: " + height);



view.setImageDrawable(result);


RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view.getLayoutParams();
params.width = width;
params.height = height;
view.setLayoutParams(params);


Log.i("Test", "done");
}

private int dpToPx(int dp)
{
float density = getApplicationContext().getResources().getDisplayMetrics().density;
return Math.round((float)dp / density);
}
Ahora bien, una vez que ya tengo escalada la imagen lo que me gustaria hacer es guardar la imagen que acabo de escalar.
¿Me podrias ayudar con esa parte?
GRACIAS!!


El 11 de marzo de 2016, 19:28, David Alonso <david.e...@gmail.com> escribió:
Reply all
Reply to author
Forward
0 new messages