package uk.co.metricat.canvasbase64; import android.graphics.Bitmap; import android.graphics.drawable.*; import android.util.Base64; import android.view.*; import com.google.appinventor.components.annotations.SimpleEvent; import com.google.appinventor.components.annotations.SimpleFunction; import com.google.appinventor.components.runtime.AndroidNonvisibleComponent; import com.google.appinventor.components.runtime.ComponentContainer; import com.google.appinventor.components.runtime.EventDispatcher; import java.io.ByteArrayOutputStream; import java.lang.reflect.*; import com.google.appinventor.components.runtime.Canvas; //import com.google.appinventor.components.runtime.Component; public class CanvasBase64 extends AndroidNonvisibleComponent { public CanvasBase64(ComponentContainer container) { super(container.$form()); } @SimpleFunction(description = "Get Canvas Image and returns base64 string") public void GetCanvasImageAsBase64(final Canvas canvas ) throws Exception { final View canvasView = canvas.getView(); final Method method = canvasView.getClass().getDeclaredMethod("buildCache"); method.setAccessible(true); Bitmap imageBitmap = (Bitmap) method.invoke(canvasView); String encodedString = bitMapToBase64(imageBitmap); AfterCanvasBase64(encodedString); } public String bitMapToBase64(Bitmap bitMap) { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); bitMap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream); byte[] byteArray = byteArrayOutputStream.toByteArray(); return Base64.encodeToString(byteArray, Base64.DEFAULT); } @SimpleEvent(description = "Called after the canvas image is converted. The text argument `canvasBase64Data` is the base64 string of the canvas image") public void AfterCanvasBase64(String canvasBase64Data) { EventDispatcher.dispatchEvent(this, "AfterCanvasBase64", canvasBase64Data); } }