0

Я пробовал несколько разных способов заставить это работать, но остановился. Я получаю фотографию с камеры и сохраняю ее с наложением.Android Изображение с камеры сохранено с наложением

Чтобы объединить изображения, я работал, как сделать это с двумя точечными изображениями и холст, как так:

Bitmap combined = Bitmap.createBitmap(mImage.getWidth(), mImage.getHeight(), null); 
    Canvas canvas = new Canvas(combined); 

    canvas.drawBitmap(image, new Matrix(), null); 
    canvas.drawBitmap(mOverlay, 0,0,null); 

    output = new FileOutputStream(new File(mFile.getPath(), mFileName + "(overlay).jpg")); 
    output.write(bytes); 
    output.close(); 

Этот вопрос я использую Camera2, который возвращает изображение. Я не разработал способ превратить изображение в растровое изображение. Я попытался сохранить изображение, а затем перезагрузить его с помощью BitmapFactory, но часто заканчиваю OutOfMemory Exceptions.

У кого-нибудь есть способ обойти это?

UPDATE

Bitmap image = Bitmap.createBitmap(mImage.getWidth(),mImage.getHeight(), Bitmap.Config.ARGB_8888); 
    image.copyPixelsFromBuffer(mImage.getPlanes()[0].getBuffer().rewind()); 

я наткнулся на это в другой ответ, но я получаю Buffer not large enough for pixels исключение, даже когда я указал буфер до 8х больше, чем должно было быть необходимо.

+0

ли оба изображения с камеры или один от ресурса и другой из камеры? –

+0

Один из ресурсов, один из камеры. Изображение ресурса в порядке – dragnflier

ответ

1

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

Образец кода, чтобы сделать это следующим образом:

ByteBuffer buffer = capturedImage.getPlanes()[0].getBuffer(); 
byte[] bytes = new byte[buffer.remaining()]; 

try { 

    Bitmap imageBitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, new BitmapFactory.Options()).copy(Bitmap.Config.RGB_565, true); 
    Bitmap combined = Bitmap.createBitmap(imageBitmap, 0, 0, imageBitmap.getWidth(), imageBitmap.getHeight()); 
    imageBitmap.recycle(); 

    //overlay needs to be scaled to image size 
    Bitmap scaledBitmap = Bitmap.createScaledBitmap(mOverlay, imageBitmap.getWidth(), imageBitmap.getHeight(), false); 
    mOverlay.recycle(); 

    Canvas canvas = new Canvas(combined); 
    canvas.drawBitmap(scaledBitmap, 0, 0, new Paint()); 

    output = new FileOutputStream(new File(path)); 
    combined.compress(Bitmap.CompressFormat.JPEG, 100, output); 
    output.close(); 

    combined.recycle(); 

    } catch (Exception ex) { 
     Log.d(TAG, "Unable to combine and save images. " + ex.getMessage()); 
    } 
+0

Очень полезно, спасибо! – davehenry

Смежные вопросы