1. 程式人生 > >HTML5 canvas實現圖片拉伸、壓縮與裁剪

HTML5 canvas實現圖片拉伸、壓縮與裁剪

前言:
我們在網頁中經常會用到圖片展示,通常情況下會給一個固定的寬高來顯示這個圖片,然而從伺服器端上傳的圖片大小是不確定的,如果直接按預設填充這個框有時候就會特別醜orz。作為一個完(wai)美(mao)主(xie)義(hui)者,讓圖片們儘可能優美地展現在網頁上是一個很愉悅的責任。
今天就給太瘦小圖片們伸展伸展或者給XXXL號減減肥吧(~ ̄▽ ̄)~

一、canvas繪圖API

工欲善其事;必先利其器。
隆重請出主角:canvas繪圖函式drawImage(),醬醬醬~

它能做什麼:
1. 繪製圖像:將載入的影象繪製到canvas上;
2. 繪製畫布:將畫好的一個canvas畫到另一個canvas上;
3. 繪製視訊:差不多就是用來視訊截圖,哇(@ο@) 好厲害。

怎麼做(敲黑板:今天只教繪製圖像啊,老師沒備課):
1. 獲取圖片

//1. 可以直接獲取DOM元素
var img = document.getElementById("imgId")
//2. 或者新建一個
var img = new Image()
img.src = "imgsrc.jpg"
  1. 獲取canvas上下文
//1. 獲取畫布
var canvas = document.getElementById("canvasId")
//2. 獲取畫布上下文
var ctx = canvas.getContext("2d")
  1. 在上下文畫畫!
img.onload = function
(){
ctx.drawImage(img,sx,sy,swidth,sheight,x,y,width,height) }

引數釋義:
drawImage有三種新增引數的情況,如下:

  1. 只規定原始圖片開始剪下的位置,預設填充剩餘寬高到畫布上:
drawImage(img,sx,sy)
  1. 從指定位置裁剪原始圖片指定寬高,填充到畫布上:
drawImage(img,sx,sy,swidth,sheight)
  1. 從指定位置裁剪原始圖片指定寬高,從指定位置開始顯示到畫布上指定寬高:
drawImage(img,sx,sy,swidth,sheight,x,y,width,height)

這裡盜個圖解釋一下:
drawImage引數值

二、拉伸並圖片

原始圖片的寬高較之顯示區域較小,就需要美美地拉伸一下。

1. 原始圖片寬高均小於顯示區域
預設情況下會將原始圖片的寬高都扯開成剛好鋪滿畫布。這個就不管了,讓它自由填充吧,freedom~

2. 原始圖片僅寬度小於顯示區域:黃色img,藍色canvas

原始圖片僅寬度小於顯示區域

預設情況會將圖片寬度拉伸,高度壓縮,圖片會被壓得很~扁~
思路:將原始圖片寬度拉開成現實區域寬度,而將高度等比例拉開,並且將超出部分上下各剪裁一半。

拉伸2

函式引數設定如下:

ctx.drawImage(img, 0, (h - 200/dw)/2, w, 200/dw, 0, 0, 300, 200)

3.原始圖片僅高度小於顯示區域

原始圖片僅高度小於顯示區域

預設情況會將圖片高度拉伸,寬度壓縮,圖片內容會被擠得很~細~
思路:將原始圖片高度拉開成現實區域寬度,而將寬度等比例拉開,並且將超出部分左右各剪裁一半。

拉伸3

引數設定如下:

ctx.drawImage(img, (w - 300/dh)/2, 0, 300/dh, h, 0, 0, 300, 200)

三、壓縮並裁剪圖片

原始圖片的寬高較之顯示區域較大,就需要小小地壓縮一下。

基本思路:在原始圖片的寬高均大於顯示區域時,首先需要確定我們以寬/高中的哪一個為基準進行壓縮,因此需要計算原始圖片的寬/高與顯示區域的寬/高的比例,以比例高(也就是相差小)的那個作為基準,等比例壓縮後相差多的那個需要裁減掉一部分。

1. dw < dh

dh>dw

預設情況會將圖片高度、寬度分別按各自的比例壓縮,圖片內容會被拉得很~扁~
思路:將原始圖片寬度壓縮成現實區域寬度,而將高度等比例拉開,並且將超出部分上下各剪裁一半。【同拉伸情況2】

拉伸2

函式引數設定如下:

ctx.drawImage(img, 0, (h - 200/dw)/2, w, 200/dw, 0, 0, 300, 200)

2. dh < dw

dh < dw

預設情況會將圖片高度、寬度按各自比例壓縮,圖片內容會被擠得很~細~
思路:將原始圖片高度拉開成現實區域寬度,而將寬度等比例拉開,並且將超出部分左右各剪裁一半。【同拉伸情況3】

拉伸3

引數設定如下:

ctx.drawImage(img, (w - 300/dh)/2, 0, 300/dh, h, 0, 0, 300, 200)

四、小結

其實不管是先拉伸再裁剪還是先壓縮再裁剪,基本思想都是一樣的:把圖片從預設的填充比例中拯救出來,讓它能等比例地變換大小,避免被奇怪的縮放比例搞得顏值比較奇怪。本文中的預設情況均是指直接使用img標籤上傳圖片的情況,相當於:

ctx.drawImage(img,0,0,w,h,0, 0, 300, 200)

劃重點!上文中的程式碼綜合如下:

var canvas = $(".good-img")[0]
var ctx = canvas.getContext("2d")
var img = new Image()
img.src = "images/3.jpg"
img.onload = function () {
    var w = img.width
    var h = img.height
    var dw = 300/w          //canvas與圖片的寬高比
    var dh = 200/h
    var ratio       
    // 裁剪圖片中間部分
    if(w > 300 && h > 200 || w < 300 && h < 200){
        if (dw > dh) {
            ctx.drawImage(img, 0, (h - 200/dw)/2, w, 200/dw, 0, 0, 300, 200)
        } else {
            ctx.drawImage(img, (w - 300/dh)/2, 0, 300/dh, h, 0, 0, 300, 200)
        }
    }
    // 拉伸圖片
    else{
        if(w < 300){
            ctx.drawImage(img, 0, (h - 200/dw)/2, w, 200/dw, 0, 0, 300, 200)
        }else {
            ctx.drawImage(img, (w - 300/dh)/2, 0, 300/dh, h, 0, 0, 300, 200)
        }
    }
}

相關推薦

HTML5 canvas實現圖片壓縮裁剪

前言: 我們在網頁中經常會用到圖片展示,通常情況下會給一個固定的寬高來顯示這個圖片,然而從伺服器端上傳的圖片大小是不確定的,如果直接按預設填充這個框有時候就會特別醜orz。作為一個完(wai)美(mao)主(xie)義(hui)者,讓圖片們儘可能優美

HTML5+canvas實現圖片壓縮上傳

1.圖片上傳輸入框<input type="file" name="" class="fileUpload" accept="image/*" capture="camera"/>2.上面時候觸發onchange$('.fileUpload').on('chang

js加canvas實現圖片的預覽壓縮和上傳

先來一張效果圖,壓壓驚第一步:使用者選擇需要上傳的圖片<input type="file" accept="image/*" type="file"" name="imageFile" onchange="upload()">在選定了圖片後 upload 函式將被

詳解onMeasure()(二)--利用onMeasure測量來實現圖片永不變形,解決螢幕適配問題

原文地址 :http://blog.csdn.net/cyp331203/article/details/45027641   上一篇文章詳細講解了一下onMeasure/measure方法在Android自定義控制元件時的原理和作用,參看博文:Androi

Android自定義控制元件系列八:詳解onMeasure()(二)--利用onMeasure測量來實現圖片永不變形,解決螢幕適配問題

        上一篇文章詳細講解了一下onMeasure/measure方法在Android自定義控制元件時的原理和作用,參看博文:Android自定義控制元件系列七:詳解onMeasure()方法中如何測量一個控制元件尺寸(一),今天就來真正實踐一下,讓這兩個方法大顯神威來幫我們搞定圖片的螢幕適配問題。

Android Zxing二維碼掃描圖片掃描框過小掃描框擴大後(或不後)閃退問題

(一)Zxing二維碼掃描框大小調整 控制掃描框大小程式碼是在CameraManager類中 google在CameraManager類中設定掃描框大小主要在getFramingRect()中: private static final int MIN_F

canvas實現圖片尺寸等比壓縮並轉換為base64字串

最近公司的一個H5活動,搜狐新聞客戶端開機圖製作,需要使用者上傳一張圖片之後,先顯示出來再進行裁剪,然後上傳base64字串到伺服器上。 但是問題來了,使用者一般上傳的圖片檔案的大小都在3-5M左右,轉成base64後提交給伺服器的話實在是太大了,到時上傳到伺服器的時候伺

HTML5 file API加canvas實現圖片前端JS壓縮並上傳 (轉載)

www. 手機 回調 pre lan 瀏覽器中 rdp 效果 二進制 一、圖片上傳前端壓縮的現實意義 對於大尺寸圖片的上傳,在前端進行壓縮除了省流量外,最大的意義是極大的提高了用戶體驗。 這種體驗包括兩方面: 由於上傳圖片尺寸比較小,因此上傳速度會比較快,交互會更

jquery擴充套件html5+canvas實現多張圖片 預覽 壓縮 上傳

主要javascript程式碼 (function($){ $.fn.extend({ aiiUpload:function(obj) { if(typeof obj !="object") { alert('引數錯誤'); retur

[轉]一種讓超大banner圖片全屏寬居中顯示的方法

posit code overflow 都是 flow cnblogs width banner 圖片 現在很多網站的Banner圖片都是全屏寬度的,這樣的網站看起來顯得很大氣。這種Banner一般都是做一張很大的圖片,然後在不同分辨率下都是顯示圖片的中間部分。實現方法如下

使用canvas 的api 實現 圖片的顯示 及 壓縮

prototype 20px 調用 判斷文件類型 llb mar 打補丁 需要 scrip 在移動端壓縮圖片並且上傳主要用到filereader、canvas 以及 formdata 這三個h5的api。邏輯並不難。整個過程就是:   (1)用戶使用input file上傳

html5canvas實現圖片自動滑動切換

轉自:http://blog.csdn.net/iamke1987/article/details/9886707 圖片自動滑動效果很多網站都要用,最近在學html5就拿這個練練手,發現用canvas實現起來其實很簡單。程式碼比較粗糙,有很多改進的地方,不過還是先記錄一

iOS 實現類似安卓.9.png圖片效果

// >= ios 5.0 UIImage *image = [[UIImage imageNamed:@"bg_box"] resizableImageWithCapInsets:UIEdgeInsetsMake(0,10,0,10)]; // < io

基於canvas實現圖片壓縮

用法: compressImg(target.files[0], 2).then(base64 => { console.log(base64) // 在這裡實現壓縮後的上傳操作 // ... }).catch(err => { // 壓縮異常 Indicator.c

Html5 Canvas 實現兩張圖片合成

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="keywords" con

ios之圖片UIImageView的stretchableImageWithLeftCapWidth方法詳解

#import "UIImage+Extension.h" @implementation UIImage (Extension) + (UIImage *)resizedImageWithName:(NSString *)name { return [self resizedImageWithN

怎樣才能實現表格背景圖片

pro 教程 如何實現 body 我們 代碼 人工智 ima imageload 分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!http://www.captainbed.net 制作隨表格拉伸的背景圖

JS上傳圖片,利用canvas實現圖片壓縮

操作 base64 itob 思考 旋轉角度 基礎 inpu url 一位 項目中的一個基礎功能-----手機上傳圖片 技術棧: 1、利用canvas進行壓縮(這個應該都比較熟悉)2、利用exif-js獲取照片旋轉角度屬性,因為有些手機機型會因為拍照時手機的方向使拍的照片帶

趙雅智_運用Bitmap和Canvas實現圖片顯示,縮小,旋轉,水印

bitmap raw 圖形 res efault ast bmp 運用 放置 上一篇已經介紹了Android種Bitmap和Canvas的使用,以下我們來寫一個詳細實例 http://blog.csdn.net/zhaoyazhi2129/article/details

ios25---圖片

哪些 小碼哥 style n) named @property name insets 保護 控制器: // // ViewController.m // 12-圖片的拉伸問題 // // Created by xiaomage on 15/12/30. //