使用Webworkers和Canvas合并png图像

syd619

我正在尝试利用网络工作者,以便将png数组合并为具有透明度的单个图像,就像合并多个图层时的photoshop一样。

我这样做的原因是因为我将所有组合的结果保存到indexeddb中以供脱机使用,然后在我的three.js应用程序中使用该图像创建纹理。

场景是大约有400种产品,并且纹理-3d平面(产品)上的图像是3个图像(产品标题,价格和产品图像)的混合。

到目前为止,我已经实现了这一点,但是图像处理并不是那么好,我想知道如果我将它们传递给Web Worker,我该如何处理呢? imageData.data

这是我到目前为止所拥有的,但是我无法使其正常工作。(此操作现在无需网络工作人员即可尝试使合并正常工作)

var images = [];
var imageData = [];

images.push( function ( callback ) {

    var mobile = new Image();

    mobile.onload = function () {
        console.log( "mobile loaded" );
        callback( null, mobile );
    };

    mobile.onerror = function ( e ) {
        console.log( "mobile error" );
        callback( e, null );
    };

    mobile.src = "mobile.png";

} );

images.push( function ( callback ) {

    var text = new Image();

    text.onload = function () {
        console.log( "text loaded" );
        callback( null, text );
    };

    text.onerror = function ( e ) {
        console.log( "text error" );
        callback( e, null );
    };

    text.src = "text.png";

} );

async.series( images, function ( err, results ) {

    if ( err ) {
        console.error( err );
    } else {
        console.log( results );
        getImageData( results );
    }

} );


var getImageData = function ( images ) {


    for ( var i = 0; i < images.length; i++ ) {

        var canvas = document.createElement( 'canvas' );

        canvas.width = 512;
        canvas.height = 512;

        var ctx = canvas.getContext( '2d' );

        ctx.drawImage( images[ i ], 0, 0 );

        imageData.push( ctx.getImageData( 0, 0, canvas.width, canvas.height ).data );

    }

    merge( imageData );

};

var merge = function ( data ) {

    var merged = [];
    var mixFactor = 0.5;

    //var newPixel = imageMainPixel * mixFactor + imageSecPixel * ( 1 - mixFactor )

    //for ( var i = 0, len = data.length; i < len; i++ ) {

    for ( var j = 0, byteLen = data[ 0 ].length; j < byteLen; j += 4 ) {

        var r = data[ 0 ][ j ] * mixFactor + data[ 1 ][ j ] * ( 1 - mixFactor );
        var g = data[ 0 ][ j + 1 ] * mixFactor + data[ 1 ][ j + 1 ] * ( 1 - mixFactor );
        var b = data[ 0 ][ j + 2 ] * mixFactor + data[ 1 ][ j + 2 ] * ( 1 - mixFactor );
        var a = data[ 0 ][ j + 3 ] * mixFactor + data[ 1 ][ j + 3 ] * ( 1 - mixFactor );

        merged[ j ] = r;
        merged[ j + 1 ] = g;
        merged[ j + 2 ] = b;
        merged[ j + 4 ] = a;

    }

    //}

    var canvas = document.getElementById( 'canvas' );
    canvas.width = 512;
    canvas.height = 512;
    var ctx = canvas.getContext( '2d' );
    var imageData = ctx.createImageData( 512, 512 );
    imageData.data.set( merged );
    ctx.putImageData( imageData, 0, 0 );

};

我目前收到的错误是这样的:

Uncaught RangeError: Source is too large

更新

我通过将合并功能更改为此来合并图像:

var merge = function ( data ) {

    var canvas = document.getElementById( 'canvas' );
    canvas.width = 512;
    canvas.height = 512;
    var ctx = canvas.getContext( '2d' );
    var imageData = ctx.createImageData( 512, 512 );
    var mixFactor = 0.5;


    for ( var j = 0, byteLen = data[ 0 ].length; j < byteLen; j += 4 ) {

        imageData.data[ j ] = data[ 0 ][ j ] * mixFactor + data[ 1 ][ j ] * ( 1 - mixFactor );
        imageData.data[ j + 1 ] = data[ 0 ][ j + 1 ] * mixFactor + data[ 1 ][ j + 1 ] * ( 1 - mixFactor );
        imageData.data[ j + 2 ] = data[ 0 ][ j + 2 ] * mixFactor + data[ 1 ][ j + 2 ] * ( 1 - mixFactor );
        imageData.data[ j + 3 ] = data[ 0 ][ j + 3 ] * mixFactor + data[ 1 ][ j + 3 ] * ( 1 - mixFactor );

    }


    console.log( imageData.data.length );

    ctx.putImageData( imageData, 0, 0 );

};

结果就像两幅图像都具有50%的不透明度。但是,这不是理想的结果。我只希望图像充当层,就像一个在另一个顶部之上有多个png ...如果一个在顶部具有透明的位置,则您应该能够看到其下的图像。

也许我应该根据alpha值进行绘制?

syd619

经过一番思考,我终于检查了每个像素的alpha值,并设法完成了我想要的。我重新编写了合并功能,如下所示:

var merge = function ( data ) {

    var canvas = document.getElementById( 'canvas' );
    canvas.width = 512;
    canvas.height = 512;
    var ctx = canvas.getContext( '2d' );
    var imageData = ctx.createImageData( 512, 512 );
    var mixFactor = 0.5;


    for ( var j = 0, byteLen = data[ 0 ].length; j < byteLen; j += 4 ) {

        // imageData.data[ j ] = data[ 0 ][ j ] * mixFactor + data[ 1 ][ j ] * ( 1 - mixFactor );
        // imageData.data[ j + 1 ] = data[ 0 ][ j + 1 ] * mixFactor + data[ 1 ][ j + 1 ] * ( 1 - mixFactor );
        // imageData.data[ j + 2 ] = data[ 0 ][ j + 2 ] * mixFactor + data[ 1 ][ j + 2 ] * ( 1 - mixFactor );
        // imageData.data[ j + 3 ] = data[ 0 ][ j + 3 ] * mixFactor + data[ 1 ][ j + 3 ] * ( 1 - mixFactor );

        imageData.data[ j ] = ( data[ 1 ][ j + 3 ] === 0 ? data[ 0 ][ j ] : data[ 1 ][ j ] );
        imageData.data[ j + 1 ] = ( data[ 1 ][ j + 3 ] === 0 ? data[ 0 ][ j + 1 ] : data[ 1 ][ j + 1 ] );
        imageData.data[ j + 2 ] = ( data[ 1 ][ j + 3 ] === 0 ? data[ 0 ][ j + 2 ] : data[ 1 ][ j + 2 ] );
        imageData.data[ j + 3 ] = ( data[ 1 ][ j + 3 ] === 0 ? data[ 0 ][ j + 3 ] : data[ 1 ][ j + 3 ] );

    }


    console.log( imageData.data.length );

    ctx.putImageData( imageData, 0, 0 );

};

仍然需要一些改进,但是我想现在我可以在Web worker中合并图像了:)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用php合并jpg和png图像?

来自分类Dev

将gif图像与png图像合并

来自分类Dev

将gif图像与png图像合并

来自分类Dev

合并Div和图像

来自分类Dev

使用ImageMagick将图像转换为PNG和JPG

来自分类Dev

使用localStorage存储和检索PNG时的空白图像

来自分类Dev

如何安装和使用PNGwriter编写PNG图像文件?

来自分类Dev

使用ImageMagick将图像转换为PNG和JPG

来自分类Dev

RxJS和WebWorkers

来自分类Dev

Phonegap和WebWorkers

来自分类Dev

使用HTML 5 Canvas时如何在png图像上划定透明区域?

来自分类Dev

Java MultiThreading,Linux进程和HTML5 Webworkers有什么区别?Webworkers和使用的实际示例是什么?

来自分类Dev

使用JavaScript和Canvas在单轴上扭曲图像

来自分类Dev

尝试使用getUserMedia和canvas捕获桌面图像

来自分类Dev

使用PHP imagecopy合并两个PNG图像不起作用

来自分类Dev

使用ImageMagick和GNU Parallel合并每对图像

来自分类Dev

使用 png++ 编写 png 图像

来自分类Dev

使用 ffmpeg 在视频上叠加图像和可调整的 png 图像

来自分类Dev

使用SurfaceView和4个Canvas图像如何找到被触摸的图像?

来自分类Dev

使用PHP压缩png图像

来自分类Dev

Chrome 与 webworkers 和 createImageBitmap 崩溃

来自分类Dev

从资源文件加载的透明PNG图像,使用Grapics32调整大小并在Canvas上绘制

来自分类Dev

使用R,如何提取.png(或其他格式)图像文件中使用的颜色和字体?

来自分类Dev

在JavaFX中使用MouseEvent和MouseClicked选择和移动Canvas图像

来自分类Dev

如何使用Kinect和OpenCV组合并显示深度和RGB图像

来自分类Dev

如何使用gem gravatar将链接和图像合并到ruby和rails中

来自分类Dev

如何使用Tampermonkey或Fashion更改所有名称为x.png和x.png的图像?

来自分类Dev

如何使用Codeigniter中的图像处理功能将文本和许多图像与图像合并在一起?

来自分类Dev

如何使用javascript / jquery将3个canvas HTML元素合并为1个图像文件?

Related 相关文章

  1. 1

    如何使用php合并jpg和png图像?

  2. 2

    将gif图像与png图像合并

  3. 3

    将gif图像与png图像合并

  4. 4

    合并Div和图像

  5. 5

    使用ImageMagick将图像转换为PNG和JPG

  6. 6

    使用localStorage存储和检索PNG时的空白图像

  7. 7

    如何安装和使用PNGwriter编写PNG图像文件?

  8. 8

    使用ImageMagick将图像转换为PNG和JPG

  9. 9

    RxJS和WebWorkers

  10. 10

    Phonegap和WebWorkers

  11. 11

    使用HTML 5 Canvas时如何在png图像上划定透明区域?

  12. 12

    Java MultiThreading,Linux进程和HTML5 Webworkers有什么区别?Webworkers和使用的实际示例是什么?

  13. 13

    使用JavaScript和Canvas在单轴上扭曲图像

  14. 14

    尝试使用getUserMedia和canvas捕获桌面图像

  15. 15

    使用PHP imagecopy合并两个PNG图像不起作用

  16. 16

    使用ImageMagick和GNU Parallel合并每对图像

  17. 17

    使用 png++ 编写 png 图像

  18. 18

    使用 ffmpeg 在视频上叠加图像和可调整的 png 图像

  19. 19

    使用SurfaceView和4个Canvas图像如何找到被触摸的图像?

  20. 20

    使用PHP压缩png图像

  21. 21

    Chrome 与 webworkers 和 createImageBitmap 崩溃

  22. 22

    从资源文件加载的透明PNG图像,使用Grapics32调整大小并在Canvas上绘制

  23. 23

    使用R,如何提取.png(或其他格式)图像文件中使用的颜色和字体?

  24. 24

    在JavaFX中使用MouseEvent和MouseClicked选择和移动Canvas图像

  25. 25

    如何使用Kinect和OpenCV组合并显示深度和RGB图像

  26. 26

    如何使用gem gravatar将链接和图像合并到ruby和rails中

  27. 27

    如何使用Tampermonkey或Fashion更改所有名称为x.png和x.png的图像?

  28. 28

    如何使用Codeigniter中的图像处理功能将文本和许多图像与图像合并在一起?

  29. 29

    如何使用javascript / jquery将3个canvas HTML元素合并为1个图像文件?

热门标签

归档