te')); return $arr; } /* 遍历用户所有主题 * @param $uid 用户ID * @param int $page 页数 * @param int $pagesize 每页记录条数 * @param bool $desc 排序方式 TRUE降序 FALSE升序 * @param string $key 返回的数组用那一列的值作为 key * @param array $col 查询哪些列 */ function thread_tid_find_by_uid($uid, $page = 1, $pagesize = 1000, $desc = TRUE, $key = 'tid', $col = array()) { if (empty($uid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('uid' => $uid), array('tid' => $orderby), $page, $pagesize, $key, $col); return $arr; } // 遍历栏目下tid 支持数组 $fid = array(1,2,3) function thread_tid_find_by_fid($fid, $page = 1, $pagesize = 1000, $desc = TRUE) { if (empty($fid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('fid' => $fid), array('tid' => $orderby), $page, $pagesize, 'tid', array('tid', 'verify_date')); return $arr; } function thread_tid_delete($tid) { if (empty($tid)) return FALSE; $r = thread_tid__delete(array('tid' => $tid)); return $r; } function thread_tid_count() { $n = thread_tid__count(); return $n; } // 统计用户主题数 大数量下严谨使用非主键统计 function thread_uid_count($uid) { $n = thread_tid__count(array('uid' => $uid)); return $n; } // 统计栏目主题数 大数量下严谨使用非主键统计 function thread_fid_count($fid) { $n = thread_tid__count(array('fid' => $fid)); return $n; } ?>jquery - How to cut an imageHTML canvas in half via javascript? - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

jquery - How to cut an imageHTML canvas in half via javascript? - Stack Overflow

programmeradmin3浏览0评论

I'm using html2canvas to turn a google map javascript API with custom features, into a canvas, and then an image.

Works fine on all browsers, except on IE 11 it generates an image with extra blank space to the right of the image, equal to the (width of browser window - map width). So the wider my window is, the more space to the right, and visa versa.

How can I slice this image (or HTMLcanvas) at exactly the edge of the actual image (768px wide)?

I found this code here but did not know how to modify it for this task:

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];
}

I'm using html2canvas to turn a google map javascript API with custom features, into a canvas, and then an image.

Works fine on all browsers, except on IE 11 it generates an image with extra blank space to the right of the image, equal to the (width of browser window - map width). So the wider my window is, the more space to the right, and visa versa.

How can I slice this image (or HTMLcanvas) at exactly the edge of the actual image (768px wide)?

I found this code here but did not know how to modify it for this task:

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];
}
Share Improve this question asked Feb 3, 2016 at 21:25 TetraDevTetraDev 17.1k7 gold badges64 silver badges63 bronze badges
Add a ment  | 

3 Answers 3

Reset to default 10

Here's a canvas cropper that creates an image. You'll need to adjust the cropping dimensions for your map.

// 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/>

Here's the code I made which takes the google map, generates a canvas, slices it at the edge of the actual image to fix the IE 11 bug, then outputs that new image, and finally prints the container.

    // 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 mand
            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
            //*  });
        }
    });

try to use haxcv library simple and easy

https://docs.haxcv/Methods/cutImage

example :

var Pixels = _("img").cutImage( x , y , width , height ) ;

_("img").src(Pixels.src);

发布评论

评论列表(0)

  1. 暂无评论