изменить размер изображения из файла - PullRequest
9 голосов
/ 07 декабря 2011

Я загружаю изображение на сервер и, прежде чем это произойдет, я хотел бы изменить размеры изображения.Я получаю изображение с URI следующим образом:

Constants.currImageURI = data.getData();

Это вызов для загрузки изображения:

String response = uploadUserPhoto(new File(getRealPathFromURI(Constants.currImageURI)));

    public String uploadUserPhoto(File image) {

    DefaultHttpClient mHttpClient;
    HttpParams params = new BasicHttpParams();
    params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
    mHttpClient = new DefaultHttpClient(params);

    try {
        HttpPost httppost = new HttpPost("http://myurl/mobile/image");

        MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);  
        multipartEntity.addPart("userID", new StringBody(Constants.userID));
        multipartEntity.addPart("uniqueMobileID", new StringBody(Constants.uniqueMobileID));
        multipartEntity.addPart("userfile", new FileBody(image, "mobileimage.jpg", "image/jpeg", "UTF-8"));
        httppost.setEntity(multipartEntity);

        HttpResponse response = mHttpClient.execute(httppost);
        String responseBody = EntityUtils.toString(response.getEntity());

        Log.d(TAG, "response: " + responseBody);
        return responseBody;

    } catch (Exception e) {
       Log.d(TAG, e.getMessage());
    }
    return "";
}

Есть ли способ изменить размер файла на основе пикселейРазмеры?

Спасибо.

Ответы [ 4 ]

22 голосов
/ 06 ноября 2012

Используйте Bitmap.createScaledBitmap , как предлагали другие.

Однако эта функция не слишком умна.Если вы масштабируете до размера менее 50%, вы, вероятно, получите это:

enter image description here

Вместо этого:

enter image description here

Видите ли вы плохое сглаживание 1-го изображения?createScaledBitmap получит вам этот результат.

Причиной является пиксельная фильтрация, при которой некоторые пиксели полностью пропускаются из источника при масштабировании до <50%. </p>

Чтобы получить 2-й результат качества, вам нужно уменьшить вдвоеРазрешение растрового изображения, если оно более чем в 2 раза превышает желаемый результат, затем, наконец, вы вызываете метод createScaledBitmap.

И существует больше подходов для деления пополам (или четверти, или увеличения) изображений.Если у вас есть растровое изображение в памяти, вы рекурсивно вызываете Bitmap.createScaledBitmap, чтобы разделить изображение пополам.

Если вы загружаете изображение из файла JPG, реализация будет еще быстрее: вы используете BitmapFactory.decodeFile и настройте параметрыПравильный параметр, в основном поле inSampleSize , которое управляет подвыборкой загруженных изображений, используя характеристики JPEG.

Многие приложения, предоставляющие миниатюры изображений, используют вслепую Bitmap.createScaledBitmap, а миниатюры просто ужасны.Будьте умны и используйте правильное понижение изображения.

9 голосов
/ 07 декабря 2011

Это взято из ThinkAndroid по этому адресу: http://thinkandroid.wordpress.com/2009/12/25/resizing-a-bitmap/

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

public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) {
    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);
    return resizedBitmap;

}

РЕДАКТИРОВАТЬ: Как предлагается в другом комментарии Bitmap.createScaledBitmap следует использовать для лучшего качества при изменении размера.

5 голосов
/ 19 марта 2016

Посмотрите, что Google рекомендует сделать (, как советовал @Pointer Null ):

public int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while ((halfHeight / inSampleSize) > reqHeight
                && (halfWidth / inSampleSize) > reqWidth) {
            inSampleSize *= 2;
        }
    }

    return inSampleSize;
}

Я называю выше, чтобы изменить размер большого изображения:

// Check if source and destination exist
// Check if we have read/write permissions

int desired_width = 200;
int desired_height = 200;

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;

BitmapFactory.decodeFile(SOME_PATH_TO_LARGE_IMAGE, options);

options.inSampleSize = calculateInSampleSize(options, desired_width, desired_height);
options.inJustDecodeBounds = false;

Bitmap smaller_bm = BitmapFactory.decodeFile(src_path, options);

FileOutputStream fOut;
try {
    File small_picture = new File(SOME_PATH_STRING);
    fOut = new FileOutputStream(small_picture);
    // 0 = small/low quality, 100 = large/high quality
    smaller_bm.compress(Bitmap.CompressFormat.JPEG, 50, fOut);
    fOut.flush();
    fOut.close();
    smaller_bm.recycle();
} catch (Exception e) {
    Log.e(LOG_TAG, "Failed to save/resize image due to: " + e.toString());
}
5 голосов
/ 07 декабря 2011

Как изменить размер растрового изображения:

Bitmap.createScaledBitmap(src, dstWidth, dstHeight, filter)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...