Наложение камеры с изменяемым размером / позиционированием элемента, чем при щелчке объединить изображения вместе - PullRequest
1 голос
/ 26 мая 2011

Мне нужно разрешить пользователю перемещать изображение на экране и изменять его размер.

Эта часть, которую я уже выполнил.

Часть, которую я не могу понять, это то, как, сделав снимок, заморозить подвижное / изменяемое размер изображения на фотоизображении, чем объединитьдва вместе, чтобы сделать 1 Bitmap.

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

РЕДАКТИРОВАТЬ.Я понимаю, что когда я делаю снимок, изображение уже застыло на экране.В этом случае я фиксирую расположение предметов на холсте.Что мне нужно сделать, так это взять холст, на котором уже что-то нарисовано, и каким-то образом наложить его на другой холст, которому я тоже присвоил фотографию.

РЕДАКТИРОВАТЬ # 2

ОК, дамы и господа,Я понял.Вот код для наложения на камеру (как описано mmeyer.)

    Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
    public void onPictureTaken(byte[] imageData, Camera c) {
        Context ct = new Context;

        RelativeLayout relativeview = new RelativeLayout(ct);
        if (imageData != null) {
            Context ct = HagsCamera.this;
            new Intent(ct, PreviewandSend.class);

        Bitmap photo = BitmapFactory.decodeByteArray(imageData, 0, imageData.length);
        int picwidth= (photo.getWidth()/2);
        int picheight = (photo.getHeight()/2);

        Bitmap photocopy = Bitmap.createScaledBitmap(photo, picwidth, picheight,     false);
            Canvas c2 = crv.canvastoreturn;
            c2.setBitmap(photocopy);
        //photo.recycle();  

        ImageView newImage = new ImageView(ct);
        relativeview.addView(newImage);
        relativeview.draw(c2);
        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                photo.getWidth()/2, photo.getHeight()/2);
        relativeview.setLayoutParams(lp);

Удачи всем вам.Я надеюсь, что это поможет сэкономить много головной боли.

Вкратце: создайте растровое изображение своей фотографии.
Создайте холст для наложения и подбросьте туда свои вещи
Получите копию наложенияcanvas
.setBitmap () это canvas и установите его в свое фото-растровое изображение.
Создайте RelativeLayout и добавьте к нему новый ImageView.
Нарисуйте свой холст на ImageView.
, затем выясните свойПараметры макета для вашего RelativeLayout.

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

1 Ответ

1 голос
/ 26 мая 2011

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

Когда пользователь хочет сделать снимок, я беру следующий кадр предварительного просмотра с камеры.PreviewCallback.onPreviewFrame (), а затем преобразовать его из YUV в растровое изображение.

Затем я получаю холст на этом растровом изображении и передаю его холсту в метод Draw () класса настраиваемого представления, который является моим оверлейным видом, и он рисует все, что рисовало на экране, на моем новом холсте!Затем я могу взять растровое изображение и сохранить его в формате jpg / png на SD.

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

Остерегайтесь здесь размеров предварительного просмотра и ошибок памяти, хотя многие телефоны имеют очень большие размеры кадра предварительного просмотра по умолчаниюа создание растровых изображений для рисования с помощью canvas может быстро разрушить память.Узнайте, как использовать Bitmap.recycle () и как контролировать собственную кучу для борьбы с ними.

Надеюсь, это поможет.

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

// decode the camera data into an immutable bitmap
Bitmap raw = CameraHelper.decodeYUV(frameInfo.frameData, frameInfo.frameSize.x, frameInfo.frameSize.y);
frameInfo.frameData = null; // allow large bytearry to to get gc'd

Bitmap cameraPic = raw.copy(Bitmap.Config.RGB_565, true);   // make a mutable copy
Canvas c2 = (new Canvas(cameraPic));        // create a canvas from the camera pic

raw.recycle(); // we're done with raw bitmap now and can reclaim from native heap.

reticleOverlay.draw(c2); // reticle overlay is a class that implements View

String filename = acquireNextShotFilename()); // get a filename to write to SD
 FileOutputStream fileoutputStream;
try {
    fileoutputStream = new FileOutputStream(filename);
 } catch (FileNotFoundException e) {
    MyLogger.e("Couldnt open fileoutputstream: ", e);
    throw e;
}  

cameraPic.compress(CompressFormat.PNG, 100, fileoutputStream);
cameraPic.recycle();
try {
    fileoutputStream.flush();
    fileoutputStream.close();
} catch (IOException e) {
    MyLogger.e("Error writing to file: ", e);
    fileoutputStream.close();
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...