Слияние двух растровых изображений в android

Я хочу объединить два растровых изображения, вот мой код

// Camera arg conversion to Bitmap Bitmap cameraBitmap = BitmapFactory.decodeByteArray(arg0, 0, arg0.length); Bitmap back = Bitmap.createBitmap(cameraBitmap.getWidth(), cameraBitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas cam = new Canvas(back); cam.drawBitmap(cameraBitmap, matrix, null); // FrameLayout to Bitmap FrameLayout mainLayout = (FrameLayout) findViewById(R.id.frame); Bitmap foreground = Bitmap.createBitmap(mainLayout.getWidth(), mainLayout.getHeight(), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(foreground); mainLayout.draw(c); Bitmap cs = null; cs = Bitmap.createBitmap(foreground.getWidth(), cameraBitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas comboImage = new Canvas(cs); comboImage.drawBitmap(cameraBitmap, 0f, 0f, null); comboImage.drawBitmap(foreground, 0f, cameraBitmap.getHeight(), null); FileOutputStream fos = null; try { fos = new FileOutputStream(file); if (fos != null) { cs.compress(Bitmap.CompressFormat.PNG, 90, fos); fos.close(); } } catch (Exception e) { e.printStackTrace(); } 

Изображение камеры должно стать фоном, а передним планом – верхним. Я попытался скомбинировать 2 изображения на Android с помощью Canvas, но это мне не помогло. Есть идеи.? благодаря

Solutions Collecting From Web of "Слияние двух растровых изображений в android"

Из вашего примера вы забыли добавить следующие строки:

  comboImage.drawBitmap(c, 0f, 0f, null); comboImage.drawBitmap(s, 0f, c.getHeight(), null); 

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

Поэтому, для моего совета, сначала создайте два растровых изображения, затем выполните следующее:

 c.drawBitmap(cameraBitmap, top point, left point, null); c.drawBitmap(foreground, top point, left point, null); 

Вы также можете сделать это, сначала создав выталкиваемые объекты из ваших растровых изображений, как в следующем коде:

 Drawable cameraBitmap = BitmapDrawable(cameraBitmap); Drawable foreground= BitmapDrawable(foreground); 

Затем, когда у вас есть доступные объекты, вы можете установить их границы, и таким образом вы установите, где вы хотите показать это изображение.

 cameraBitmap.setBounds(left, top, right, bottom); foreground.setBounds(left, top, right, bottom); 

И, наконец, нарисовать это на холсте:

 cameraBitmap.draw(canvas); foreground.draw(canvas); 

РЕДАКТИРОВАТЬ:

Это пример, используйте это, чтобы понять вашу реализацию:

  Bitmap bitmap = null; try { bitmap = Bitmap.createBitmap(500, 500, Config.ARGB_8888); Canvas c = new Canvas(bitmap); Resources res = getResources(); Bitmap bitmap1 = BitmapFactory.decodeResource(res, R.drawable.test1); //blue Bitmap bitmap2 = BitmapFactory.decodeResource(res, R.drawable.test2); //green Drawable drawable1 = new BitmapDrawable(bitmap1); Drawable drawable2 = new BitmapDrawable(bitmap2); drawable1.setBounds(100, 100, 400, 400); drawable2.setBounds(150, 150, 350, 350); drawable1.draw(c); drawable2.draw(c); } catch (Exception e) { } return bitmap; 

Это то, что я получаю от кода выше:

Введите описание изображения здесь

Обратите внимание, что BitmapDrawable (Bitmap) устарел. Кинди проверяет это на альтернативу.

BitmapDrawable(Bitmap bitmap) Этот конструктор был устарел на уровне API 4. Используйте BitmapDrawable(Resources, Bitmap) чтобы гарантировать, что drawable правильно установил свою целевую плотность.

Изменить размер водяного знака на тот же размер, что и исходное изображение

 Uri bmpUri1 = getLocalBitmapUri(ivImage); Uri bmpUri2 = getLocalBitmapUri(watermark_imageview); try { bm1 = BitmapFactory.decodeStream( getContentResolver().openInputStream(bmpUri1)); bm2 = BitmapFactory.decodeStream( getContentResolver().openInputStream(bmpUri2)); Bitmap bmOverlay = Bitmap.createBitmap(bm1.getWidth(), bm1.getHeight(), bm1.getConfig()); bm2 = Bitmap.createScaledBitmap(bm2, bm1.getWidth(), bm1.getHeight(), true); Canvas canvas = new Canvas(bmOverlay); canvas.drawBitmap(bm1, 0,0, null); canvas.drawBitmap(bm2, 0,0, null); watermarkimage.setVisibility(View.GONE); im =new ImageView(ImageClick.this); im.setImageBitmap(bmOverlay); bmpUri = getLocalBitmapUri(im); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } private Uri getLocalBitmapUri(ImageView imageView) { Drawable drawable = imageView.getDrawable(); Bitmap bmp = null; if (drawable instanceof BitmapDrawable){ bmp = ((BitmapDrawable) imageView.getDrawable()).getBitmap(); } else { return null; } // Store image to default external storage directory Uri bmpUri = null; try { File file = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DOWNLOADS), "share_image_" + System.currentTimeMillis() + ".png"); file.getParentFile().mkdirs(); FileOutputStream out = new FileOutputStream(file); bmp.compress(Bitmap.CompressFormat.PNG, 90, out); out.close(); bmpUri = Uri.fromFile(file); } catch (IOException e) { e.printStackTrace(); } return bmpUri; }