代码之家  ›  专栏  ›  技术社区  ›  Crashalot

如何将图像缩放并居中到正方形尺寸?

  •  0
  • Crashalot  · 技术社区  · 5 年前

    这些问题很相似,但没有帮助: this , this this ,和

    代码应该:(1)缩放图像以适合100x100画布(2) 保持纵横比;以及(3)将图像在画布内垂直和水平居中。

        // Create canvas element.
        var canvas = $(document.createElement("canvas"));
    
        // Get canvas context.
        var context = canvas[0].getContext("2d");
    
        // Set canvas size.
        canvas[0].width = 100;
        canvas[0].height = 100;
    
        // Write image to canvas.
        context.drawImage(image, 0, 0, newWidth, newHeight);
    

    enter image description here

    1 回复  |  直到 5 年前
        1
  •  1
  •   Blindman67    5 年前

    要使图像适合画布,同时保留纵横比,请使用以下命令

    const w = image.naturalWidth;
    const h = image.naturalHeight;
    
    // Get the min scale to fit the image to the canvas
    const scale = Math.min(canvas.width / w, canvas.height / h);
    
    // Set the transform to scale the image, and center to the canvas
    ctx.setTransform(scale, 0, 0, scale, canvas.width / 2, canvas.height / 2);
    
    // draw the image offset by half its width and height to center and fit
    ctx.drawImage(image, -w / 2, -h / 2, w, h);
    
    // to reset the transform
    // ctx.setTransform(1,0,0,1,0,0);
    
        2
  •  1
  •   Crashalot    5 年前

        // Create canvas element.
        var canvas = $(document.createElement("canvas"));
    
        // Get canvas context.
        var context = canvas[0].getContext("2d");
    
        // Set canvas size.
        canvas[0].width = canvasWidth;
        canvas[0].height = canvasHeight;
    
        // Set image size, must use image.naturalWidth and image.naturalHeight -- not image.width and image.height.
        const imageWidth = image.naturalWidth;
        const imageHeight = image.naturalHeight;
    
        // Set scale to fit image to canvas, 
        const scale = Math.min(canvasWidth/imageWidth, canvasHeight/imageHeight);
    
        // Set new image dimensions.
        const scaledWidth = imageWidth * scale;
        const scaledHeight = imageHeight * scale;
    
        // Draw image in center of canvas.
        context.drawImage(image, (canvasWidth - scaledWidth)/2, (canvasHeight - scaledHeight)/2, scaledWidth, scaledHeight);
    
        3
  •  0
  •   NickSlash    5 年前

    假设我的计算是正确的,下面的方法可能有用吗?

    ratio = image.width/image.height;
    if (image.width > image.height) {
        output.height = ( 100 / ratio ) 
        output.width = 100
        output.x = 0
        output.y = (100 - output.height) / 2
    } else {
        output.height = 100
        output.width = 100 * ratio
        output.x = (100 - output.width) / 2
        output.y = 0
    }