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

1

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

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

Часть, которую я не могу понять, заключается в том, как при съемке заморозить перемещаемое/изменяемое по размеру изображение на изображении photo-, чем объединить два вместе, чтобы сделать 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);

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

Вкратце: сделайте растровое изображение своего изображения.
Сделайте холст для вашего наложения и подбросьте свои вещи там

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

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

  • 0
    Вы говорите, что хотите объединить пиксели из кадра предварительного просмотра камеры с растровым изображением / представлением, которое вы наложили на вид поверхности, который содержит предварительный просмотр вашей камеры? Если это так, я сделал это и могу дать несколько советов. То, что вы хотите объединить с предварительным просмотром, уже в пользовательском классе View, который вы реализовали?
  • 0
    Да, на экране появляется все, когда пользователь делает фотографию. Мне просто нужно собрать их в одно красивое изображение, я медленно перебираю ответ джентльменов из-под нижних ... но если ваши советы приходят одновременно, все веселее.
Теги:
overlay
android-canvas
bitmap

1 ответ

1
Лучший ответ

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

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

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

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

Остерегайтесь размеров предварительного просмотра и ошибок в памяти, хотя многие телефоны имеют очень большие размеры кадра предварительного просмотра по умолчанию и создание растровых изображений для рисования с помощью холста могут быстро пережевывать память. Узнайте, как использовать 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();
} 
  • 0
    Спасибо, Ммейер. Я сделаю все возможное, чтобы сделать эту работу. Я надеюсь, что смогу поставить галочку в этом поле, и любой, кто прочитает ваш ответ и увидит, что он не отмечен, не должен игнорировать его. Скорее всего, я новичок и не смог заставить его работать.
  • 0
    Ну, хорошие новости и плохие новости. Через смесь вашего кода и некоторых указателей я нашел в интернете. Мне удалось заставить его успешно сделать снимок с оверлеем 1 раз. С следующей попытки, без внесения каких-либо изменений в код. (и вот плохие новости) Все изображения пустые с черным фоном. Я считаю, что это подходит для другого вопроса, хотя. Но ваш ответ был правильным. Когда я заработаю 100%, я вернусь сюда и выложу фрагменты.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню