@TIMAI2 does not need Component Image, we can try this:
@SimpleFunction( description = "Canvas to Base 64")
public void CanvasToBase64(final Canvas canvas) throws Exception {
final View canvasView = canvas.getView();
final Field bitmapField = canvasView.getClass().getDeclaredField("bitmap");
bitmapField.setAccessible(true);
final Bitmap bitmap = (Bitmap) bitmapField.get(canvasView);
String encodedString = bitMapToBase64(bitmap);
AfterPictureBase64(encodedString);
}
public String bitMapToBase64(Bitmap bitMap) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitMap.compress(Bitmap.CompressFormat.PNG, 50, byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream.toByteArray();
return Base64.encodeToString(byteArray, Base64.DEFAULT);
}
@SimpleEvent(description = "Called after the picture is taken. The text argument `base64Data` is the base64 string of the image")
public void AfterPictureBase64(String base64Data) {
EventDispatcher.dispatchEvent(this, "AfterPictureBase64", base64Data);
}
My tests will return drawn items (text,circles etc) but neither the background colour or a background image.....(I place the base64 output to another canvas as a background image)
@SimpleFunction(
description = "Get Canvas Image and returns base64 string")
public void GetCanvasImageAsBase64(final Canvas canvas) throws Exception {
final View canvasView = canvas.getView();
final Field bitmapField = canvasView.getClass().getDeclaredField("bitmap");
bitmapField.setAccessible(true);
final Bitmap imageBitmap = (Bitmap) bitmapField.get(canvasView);
String encodedString = bitMapToBase64(imageBitmap);
AfterCanvasBase64(encodedString);
}
Unfortunately, setDrawingCacheEnabled and getDrawingCache are deprecated after API 28
I have been looking at this example:
public static Bitmap loadBitmapFromView(View v) {
Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
v.layout(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
v.draw(c);
return b;
}
or this
public static Bitmap getBitmapFromView(View view) {
Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(returnedBitmap);
Drawable bgDrawable =view.getBackground();
if (bgDrawable!=null)
bgDrawable.draw(canvas);
else
canvas.drawColor(Color.WHITE);
view.draw(canvas);
return returnedBitmap;
}
If we have a second canvas (doesn't look like we can create one)......might cause a blink on screen...but need to link the second canvas in to the function.
If you want to get the bitmap from an Image component then use getView method on it that will return the ImageView, if there is a function named getBitmapDrawable (BitmapDrawable) and finally use getBitmap on that.
For the first and second errors resulted in by theImageView symbol, it appears the android.view.ImageView class wasn't imported, importing it should get it fixed.
For the second error, i think the imageComponent variable in @Kumaraswamy's code is equivalent to the image variable in your code, renaming imageComponent to image should work.
The fourth error should be resolved by applying the first fix.