Как разрезать холст изображения / HTML пополам с помощью javascript?

Я использую html2canvas, чтобы превратить Google map javascript API с пользовательскими функциями в холст, а затем изображение.

отлично работает во всех браузерах, за исключением IE 11, он генерирует изображение с дополнительным пробелом справа от изображения, равным (ширина окна браузера-ширина карты). Так что чем шире мое окно, тем больше места справа, и наоборот.

Как я могу нарезать это изображение (или HTMLcanvas) точно на краю фактического изображения (768px широкий)?

IE11 image

Я нашел этот код здесь, но не знаю, как изменить его для этой задачи:

var image = new Image();
image.onload = cutImageUp;
image.src = 'myimage.png';

function cutImageUp() {
    var imagePieces = [];
    for(var x = 0; x < numColsToCut; ++x) {
        for(var y = 0; y < numRowsToCut; ++y) {
            var canvas = document.createElement('canvas');
            canvas.width = widthOfOnePiece;
            canvas.height = heightOfOnePiece;
            var context = canvas.getContext('2d');
            context.drawImage(image, x * widthOfOnePiece, y * heightOfOnePiece, widthOfOnePiece, heightOfOnePiece, 0, 0, canvas.width, canvas.height);
            imagePieces.push(canvas.toDataURL());
        }
    }

    // imagePieces now contains data urls of all the pieces of the image

    // load one piece onto the page
    var anImageElement = document.getElementById('myImageElementInTheDom');
    anImageElement.src = imagePieces[0];
}

3 ответов


вот обрезка холста, которая создает изображение. Вам нужно будет настроить размеры обрезки для вашей карты.

// initialize the test canvas and wireup cut button.
(function() {
  var can = document.getElementById('test');
  var w = can.width = 400;
  var h = can.height = 200;
  var ctx = can.getContext('2d');

  ctx.fillStyle = "#336699";
  ctx.fillRect(0, 0, 200, 200);
  ctx.strokeStyle = "#000000";
  ctx.lineWidth = 20;
  ctx.strokeRect(0, 0, w, h);
  ctx.strokeRect(0, 0, w / 2, h);
  var btn = document.getElementById('cut');
  btn.addEventListener('click', function() {
     
    var croppedCan = crop(can, {x: 0, y: 0}, {x: 200, y: 200});
    
    // Create an image for the new canvas.
    var image = new Image();
    image.src = croppedCan.toDataURL();
  
    // Put the image where you need to.
    document.getElementsByTagName('body')[0].appendChild(image);
    return image;
    
  });
})();


// function crop
// Returns a cropped canvas given a cavnas and crop region.
//
// Inputs:
// can, canvas
// a, {x: number, y: number} - left top corner
// b, {x: number, y: number} - bottom right corner

function crop(can, a, b) {
    // get your canvas and a context for it
    var ctx = can.getContext('2d');
    
    // get the image data you want to keep.
    var imageData = ctx.getImageData(a.x, a.y, b.x, b.y);
  
    // create a new cavnas same as clipped size and a context
    var newCan = document.createElement('canvas');
    newCan.width = b.x - a.x;
    newCan.height = b.y - a.y;
    var newCtx = newCan.getContext('2d');
  
    // put the clipped image on the new canvas.
    newCtx.putImageData(imageData, 0, 0);
  
    return newCan;    
 }
<button id='cut'>Crop</button>
<hr/>
<canvas id='test'></canvas>
<hr/>

вот код, который я сделал, который берет карту google, генерирует холст, срезает его на краю фактического изображения, чтобы исправить ошибку IE 11, затем выводит это новое изображение и, наконец, печатает контейнер.

    // Insert map container for output to printer 
    var element = $("#map-container");
    var printContainer = $("#printContainer");

    html2canvas(element, {
        useCORS: true,
        onrendered: function (canvas) {

            // Must clear the printContainer before each session prints, or it will also print the previous info (if user presses the print results button twice)
            printContainer.empty();

            // Put the map into a canvas inside #printContainer
            printContainer.append(canvas);

            // Find the canvas we just made
            var myCanvas = printContainer.find("canvas")[0]; // add the [0] to get the native DOM element object
            myCanvas.id = 'generatedCanvas1';

            // Check if we're running IE 11 or earlier
            var ua = window.navigator.userAgent;
            var isIE = (ua.indexOf('MSIE') > 0 || ua.indexOf('Trident') > 0);

            if (isIE) {
                console.log("We're on IE");

                // ==========================================================================================
                // ======= IE Fix for canvas / image generation - slice the canvas ==========================
                // ==========================================================================================


                // function crop
                // Returns a cropped canvas given a cavnas and crop region.
                //
                // Inputs:
                // can, canvas
                // a, {x: number, y: number} - left top corner
                // b, {x: number, y: number} - bottom right corner


                (function() {
                    var croppedCan = crop(myCanvas, { x: 0, y: 0 }, { x: 800, y: 768 });

                    // Create an image for the new canvas.
                    var image = new Image();
                    image.src = croppedCan.toDataURL();


                    // Should we print the map image? Only if this is true...
                    if ($('*').hasClass('map-invisible posrel map-show')) {

                        //var dataUrl = canvas.toDataURL("image/png");

                        imageMap = '<p style="text-align:center;"><img id="canvasImage" src="' + image.src + '"  height="800" width="768" /></p>';
                        div.append('<p>&nbsp;</p>').html();
                        div.append(imageMap);
                    }

                    // Put the image where you need to.
                    //document.getElementById('printContainer').appendChild(image);
                    return image;

                    //});
                })();


                function crop(can, a, b) {
                    // get your canvas and a context for it
                    var ctx = can.getContext('2d');

                    // get the image data you want to keep.
                    var imageData = ctx.getImageData(a.x, a.y, b.x, b.y);

                    // create a new cavnas same as clipped size and a context
                    var newCan = document.createElement('canvas');
                    newCan.width = b.x - a.x;
                    newCan.height = b.y - a.y;
                    var newCtx = newCan.getContext('2d');

                    // put the clipped image on the new canvas.
                    newCtx.putImageData(imageData, 0, 0);

                    return newCan;
                }


                // ==========================================================================================
                // ======= END IE Fix for canvas / image generation - slice the canvas ======================
                // ==========================================================================================
            } else {
               console.log("We're not on IE");
                // For all other browsers except IE

                // Should we print the map image? Only if this is true...
                if ($('*').hasClass('map-invisible posrel map-show')) {

                    var image = new Image();
                    image.src = canvas.toDataURL("image/png");

                    imageMap = '<p style="text-align:center;"><img id="canvasImage" src="' + image.src + '"  height="800" width="768" /></p>';
                    div.append('<p>&nbsp;</p>').html();
                    div.append(imageMap);
                }
            }


            // Build the data set
            div.append(criteriaDiv);
            div.append(pageTable).html();


            // Add the new data into the hidden printContainer
            printContainer.append(div);

            // Remove the original canvas which was cropped so it doesnt print with the new canvas image
            $("#generatedCanvas1").remove();

            // Fire the print command
            printContainer.printThis({
                //debug: true
                printDelay: 1500            // variable print delay needed so that css has time to load for the printout

            });


            // For Debugging with the "#printMe" button
            $(function () {
                $("#printMe").click(function () {
                    //$printIframe.printThis({
                    //    debug: true,
                    printDelay: 1500            // variable print delay

                    //});
                    var $iframe = $("iframe[name='printIframe']");


                    setTimeout(function () {
                        if ($iframe.hasClass("MSIE")) {
                            // check if the iframe was created with the ugly hack
                            // and perform another ugly hack out of neccessity
                            window.frames["printIframe"].focus();
                            $head.append("<script>  window.print(); </script>");
                        } else {
                            // proper method
                            if (document.queryCommandSupported("print")) {
                                $iframe[0].contentWindow.document.execCommand("print", false, null);
                            } else {
                                $iframe[0].contentWindow.focus();
                                $iframe[0].contentWindow.print();
                            }
                        }


                    }, 333);
                });
            });

            // PrintThis usage and options
            //*  $("#mySelector").printThis({
            //*      debug: false,               * show the iframe for debugging
            //*      importCSS: true,            * import page CSS
            //*      importStyle: false,         * import style tags
            //*      printContainer: true,       * grab outer container as well as the contents of the selector
            //*      loadCSS: "path/to/my.css",  * path to additional css file - us an array [] for multiple
            //*      pageTitle: "",              * add title to print page
            //*      removeInline: false,        * remove all inline styles from print elements
            //*      printDelay: 333,            * variable print delay
            //*      header: null,               * prefix to html
            //*      formValues: true            * preserve input/form values
            //*  });
        }
    });

попробуйте использовать библиотеку haxcv простой и легкий

https://docs.haxcv.org/Methods/cutImage

пример :

var пикселей = _("img").cutImage (x, y, ширина, высота);

_("img").src (пиксели.src);