Android: обрезка растрового изображения (странным образом) - PullRequest
0 голосов
/ 05 июля 2011

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

Все проблемы связаны с тем, что изображение должно быть 480 x 800. Камера на устройстве, которое я использую (Motorola Xoom), очевидно, не поддерживает это соотношение сторон.

Я ищу способ сделать снимок большего размера (1280 x 960 имеет достаточно большую высоту), а затем начать стричь большие куски с обеих сторон, сверху и снизу.

Так что, если кто-то может предоставить способ сделать это (или лучшую идею), я был бы очень признателен.

Спасибо.

1 Ответ

1 голос
/ 05 июля 2011

Лучше всего изменить размер изображения до 480 по ширине или до 800 по высоте и показать его с соответствующими отступами. Вот простой способ сделать это:

import android.graphics.Bitmap;

public class ImageUtils {
    public static Bitmap  BitmapResizeToMaxXorY(Bitmap srcBitmap, int destSizeX, int destSizeY) {
        Bitmap ret = null;

        if (srcBitmap != null && destSizeX > 0 && destSizeY > 0) {
            Float origSizeX  = new Float(srcBitmap.getWidth());
            Float origSizeY = new Float(srcBitmap.getHeight());

            if (origSizeX > destSizeX || origSizeY > destSizeY) {
                float origRatio =  origSizeX / origSizeY;
                float destRatio = destSizeX / destSizeY;

                float targetSizeX;
                float targetSizeY;

                if (origRatio >= destRatio) {
                    if (destSizeX >= origSizeX) {
                        targetSizeX = origSizeX;
                    } else {
                        targetSizeX = destSizeX;
                    }

                    targetSizeY = targetSizeX / origRatio;
                } else {
                    if (destSizeY >= origSizeY) {
                        targetSizeY = origSizeY;
                    } else {
                        targetSizeY = destSizeY;
                    }

                    targetSizeX = targetSizeY * origRatio;
                }

                ret = Bitmap.createScaledBitmap(srcBitmap, (int) targetSizeX, (int) targetSizeY, false);
            } else {
                // original image is smaller than destination sizes so we are returning original
                ret = srcBitmap;
            }           
        }

        return ret;
    }
}
...