Мне нужно позволить пользователю перемещать изображение вокруг экрана и изменять его размер.
Эта часть, которую я уже выполнил.
Часть, которую я не могу понять, заключается в том, как при съемке заморозить перемещаемое/изменяемое по размеру изображение на изображении 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 изображения... и просто сохранить это... Вы можете проверить это самостоятельно.
Я сделал что-то в прошлом, когда у меня есть надводный вид поверх поверхностного вида, который содержит предварительный просмотр камеры.
Когда пользователь хочет захватить рис, я беру следующий кадр предварительного просмотра из 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();
}