Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Drawing canvas with an image picked with Cordova Camera Plugin

I'm getting an image from device and drawing a canvas with filters using Pixi JS. It works all well using computer to get an image. But when I'm on IOS, it throws errors such as cross origin issue, or that I'm trying to use an unknown format.

This is the code I'm using to draw the image (that works on web/desktop but not cordova built ios app)

_renderImage() {
    let wWidth;
    if (window.outerWidth > 414) {
      wWidth = 414;
    } else {
      wWidth = window.outerWidth;
    }

    const img = new Image();
    img.src = this.state.avatarSource;

    let lower;
    if (img.width > img.height) {
      lower = img.height;
    } else {
      lower = img.width;
    }

    const canvas = this.refs.canvasimg;
    if (canvas.hasChildNodes()) {
      canvas.removeChild(canvas.childNodes[0]);
    }

    const renderer = PIXI.autoDetectRenderer(wWidth, wWidth * 1.25, {transparent: true});
    const stage = new PIXI.Container();

    canvas.appendChild(renderer.view);

    // create a PIXI sprite from an image path
    const canvasImg = PIXI.Sprite.fromImage(this.state.avatarSource);
    canvasImg.anchor.x = 0;
    canvasImg.anchor.y = 0;
    canvasImg.width = wWidth;
    canvasImg.height = wWidth * 1.25;

    const filter = this._getImageFilter();

    stage.filters = [filter];
    stage.addChild(canvasImg);

    render();

    function render(){
      requestAnimationFrame(render);
      renderer.render(stage);
    }
  }

And this is the code I use to pick the image using cordova camera plugin:

_getPhoto(isPhotosLib) {
    const captureSuccess = (imageData) => {
      this.m.setState({
        // avatarSource: `data:image/jpeg;base64,${imageData}`
        avatarSource: imageData
      })
    };

    const captureError = (error) => {
      navigator.notification.alert('Error code: ' + error.code, null, 'Capture Error');
    };

    let options = {
      quality: 100,
      targetWidth: 640,
      targetHeight: 640,
      saveToPhotoAlbum: false,
      destinationType: Camera.DestinationType.FILE_URI,
      popoverOptions: new CameraPopoverOptions(640, 640, 100, 100, Camera.PopoverArrowDirection.ARROW_ANY)
    }

    isPhotosLib ? options.sourceType = Camera.PictureSourceType.PHOTOLIBRARY : null;

    navigator.camera.getPicture(captureSuccess, captureError, options);
  }

The error I get is this:

Failed to load resource: Origin null is not allowed by Access-Control-Allow-Origin.

And on XCode:

[Generic] Creating an image format with an unknown type is an error

And when I changed to NATIVE_URI, it logs this error:

Failed to load resource: unsupported URL
assets-library://asset/asset.JPG?id=2DDAD0CF-2F82-40A0-B84B-398C996AC749&ext=JPG

So what could be the reason that it doesn't work on ios?

like image 373
Emo Avatar asked Nov 08 '22 23:11

Emo


2 Answers

Check out this post regarding the Cordova Whitelist Plugin, it has solved most of my issues.
I don't know whether or not you are using any WKWebView plugins, but the cordova-wkwebview-engine plugin supports some iOS specific Application Transport Security settings as well https://github.com/apache/cordova-plugin-wkwebview-engine.

Another workaround would be to use an HTML input tag to initiate the camera capture:

<input type="file" capture="camera" accept="image/*" />

And just listen to the "change" event.

like image 198
Eerik Kivistik Avatar answered Nov 15 '22 00:11

Eerik Kivistik


on the option section, set as DATA_URL :

destinationType: Camera.DestinationType.DATA_URL

this will get image as base64 format, to display the image, add

<img src="data:image/jpeg;base64,'+ imageData +'">

then the canvas draw from this img tag

like image 43
dhir Avatar answered Nov 15 '22 00:11

dhir