国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

【W(wǎng)eb技術(shù)】696- 詳解 JS 壓縮圖片

共 12490字,需瀏覽 25分鐘

 ·

2020-08-25 08:16



作者:wuwhs

https://segmentfault.com/a/1190000023486410


前 言


公司的移動(dòng)端業(yè)務(wù)需要在用戶上傳圖片是由前端壓縮圖片大小,再上傳到服務(wù)器,這樣可以減少移動(dòng)端上行流量,減少用戶上傳等待時(shí)長(zhǎng),優(yōu)化用戶體驗(yàn)。


插播一下,本文案例已整理成插件,已上傳 npm ,可通過(guò) npm install js-image-compressor -D 安裝使用,可以從 github 下載。


JavaScript 操作壓縮圖片原理不難,已有成熟 API,然而在實(shí)際輸出壓縮后結(jié)果卻總有意外,有些圖片竟會(huì)越壓縮越大,加之終端(手機(jī))類型眾多,有些手機(jī)壓縮圖片甚至變黑。



所以本文將試圖解決如下問(wèn)題:


弄清 Image 對(duì)象、data URL、Canvas 和 File(Blob)之間的轉(zhuǎn)化關(guān)系;


圖片壓縮關(guān)鍵技巧;


超大圖片壓縮黑屏問(wèn)題。


轉(zhuǎn) 化 關(guān) 系


在實(shí)際應(yīng)用中有可能使用的情境:


大多時(shí)候我們直接讀取用戶上傳的 File 對(duì)象,讀寫到畫布(canvas)上,利用 Canvas 的 API 進(jìn)行壓縮,完成壓縮之后再轉(zhuǎn)成 File(Blob) 對(duì)象,上傳到遠(yuǎn)程圖片服務(wù)器;


不妨有時(shí)候我們也需要將一個(gè) base64 字符串壓縮之后再變?yōu)?base64 字符串傳入到遠(yuǎn)程數(shù)據(jù)庫(kù)或者再轉(zhuǎn)成 ?File(Blob) 對(duì)象。


一般的,它們有如下轉(zhuǎn)化關(guān)系:



具 體 實(shí) 現(xiàn)


下面將按照轉(zhuǎn)化關(guān)系圖中的轉(zhuǎn)化方法一一實(shí)現(xiàn)。


file2DataUrl(file, callback)


用戶通過(guò)頁(yè)面標(biāo)簽 上傳的本地圖片直接轉(zhuǎn)化 data URL 字符串形式??梢允褂?FileReader 文件讀取構(gòu)造函數(shù)。


FileReader 對(duì)象允許 Web 應(yīng)用程序異步讀取存儲(chǔ)在計(jì)算機(jī)上的文件(或原始數(shù)據(jù)緩沖區(qū))的內(nèi)容,使用 File 或 Blob 對(duì)象指定要讀取的文件或數(shù)據(jù)。


實(shí)例方法 readAsDataURL 讀取文件內(nèi)容并轉(zhuǎn)化成 base64 字符串。在讀取完后,在實(shí)例屬性 result 上可獲取文件內(nèi)容。


function?file2DataUrl(file,?callback)?{  var reader = new FileReader();  reader.onload = function () {    callback(reader.result);  };  reader.readAsDataURL(file);}


Data URL 由四個(gè)部分組成:前綴(data:)、指示數(shù)據(jù)類型的 MIME 類型、如果非文本則為可選的 base64 標(biāo)記、數(shù)據(jù)本身:


data:<mediatype>,<data>


比如一張 png 格式圖片,轉(zhuǎn)化為 base64 字符串形式:


data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAgAElEQVR4XuxdB5g。


file2Image(file, callback)


若想將用戶通過(guò)本地上傳的圖片放入緩存并 img 標(biāo)簽顯示出來(lái),除了可以利用以上方法轉(zhuǎn)化成的 base64 字符串作為圖片 src,還可以直接用 URL 對(duì)象,引用保存在 File 和 Blob 中數(shù)據(jù)的 URL。


使用對(duì)象 URL 的好處是可以不必把文件內(nèi)容讀取到 JavaScript 中 而直接使用文件內(nèi)容。


為此,只要在需要文件內(nèi)容的地方提供對(duì)象 URL 即可。? ? ? ? ? ? ? ?


function?file2Image(file,?callback)?{  var image = new Image();  var URL = window.webkitURL || window.URL;  if (URL) {    var url = URL.createObjectURL(file);    image.onload = function() {      callback(image);      window.revokeObjectURL(url);    };    image.src = url;  } else {    inputFile2DataUrl(file, function(dataUrl) {      image.onload = function() {        callback(image);      }      image.src = dataUrl;    });  }}


注意:要?jiǎng)?chuàng)建對(duì)象 URL,可以使用 window.URL.createObjectURL() 方法,并傳入 File 或 Blob 對(duì)象。


如果不再需要相應(yīng)數(shù)據(jù),最好釋放它占用的內(nèi)容。但只要有代碼在引用對(duì)象 URL,內(nèi)存就不會(huì)釋放。要手工釋放內(nèi)存,可以把對(duì)象 URL 傳給 window.revokeObjectURL()。


url2Image(url, callback)


通過(guò)圖片鏈接(url)獲取圖片 Image 對(duì)象,由于圖片加載是異步的,因此放到回調(diào)函數(shù) callback 回傳獲取到的 Image 對(duì)象。? ? ? ? ? ? ? ?


function?url2Image(url,?callback)?{  var image = new Image();  image.src = url;  image.onload = function() {    callback(image);  }}


image2Canvas(image)


利用 drawImage() 方法將 Image 對(duì)象繪畫在 Canvas 對(duì)象上。


drawImage 有三種語(yǔ)法形式:


void ctx.drawImage(image, dx, dy);
void ctx.drawImage(image, dx, dy, dWidth, dHeight);
void ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);


參數(shù):


image 繪制到上下文的元素;


sx 繪制選擇框左上角以 Image 為基準(zhǔn) X 軸坐標(biāo);


sy 繪制選擇框左上角以 Image 為基準(zhǔn) Y 軸坐標(biāo);


sWidth 繪制選擇框?qū)挾龋?/p>


sHeight 繪制選擇框?qū)挾龋?/p>


dx Image 的左上角在目標(biāo) canvas 上 X 軸坐標(biāo);


dy Image 的左上角在目標(biāo) canvas 上 Y 軸坐標(biāo);


dWidth Image 在目標(biāo) canvas 上繪制的寬度;


dHeight Image 在目標(biāo) canvas 上繪制的高度;



function?image2Canvas(image)?{  var canvas = document.createElement('canvas');  var ctx = canvas.getContext('2d');  canvas.width = image.naturalWidth;  canvas.height = image.naturalHeight;  ctx.drawImage(image, 0, 0, canvas.width, canvas.height);  return canvas;}


canvas2DataUrl(canvas, quality, type)


HTMLCanvasElement 對(duì)象有 toDataURL(type, encoderOptions) 方法,返回一個(gè)包含圖片展示的 data URL 。同時(shí)可以指定輸出格式和質(zhì)量。


參數(shù)分別為:


type 圖片格式,默認(rèn)為 image/png;


encoderOptions 在指定圖片格式為 image/jpeg 或 image/webp 的情況下,可以從 0 到 1 的區(qū)間內(nèi)選擇圖片的質(zhì)量。


如果超出取值范圍,將會(huì)使用默認(rèn)值 0.92,其他參數(shù)會(huì)被忽略。


function?canvas2DataUrl(canvas,?quality,?type)?{  return canvas.toDataURL(type || 'image/jpeg', quality || 0.8);}


? ? ? ? ? ? ? ?

dataUrl2Image(dataUrl, callback)


圖片鏈接也可以是 base64 字符串,直接賦值給 Image 對(duì)象 src 即可。? ?


function?dataUrl2Image(dataUrl,?callback)?{  var image = new Image();  image.onload = function() {    callback(image);  };  image.src = dataUrl;}


dataUrl2Blob(dataUrl, type)


將 data URL 字符串轉(zhuǎn)化為 Blob 對(duì)象。


主要思路是:先將 data URL 數(shù)據(jù)(data) 部分提取出來(lái),用 atob 對(duì)經(jīng)過(guò) base64 編碼的字符串進(jìn)行解碼,再轉(zhuǎn)化成 Unicode 編碼,存儲(chǔ)在Uint8Array(8位無(wú)符號(hào)整型數(shù)組,每個(gè)元素是一個(gè)字節(jié)) 類型數(shù)組,最終轉(zhuǎn)化成 Blob 對(duì)象。? ? ?


function?dataUrl2Blob(dataUrl,?type)?{  var data = dataUrl.split(',')[1];  var mimePattern = /^data:(.*?)(;base64)?,/;  var mime = dataUrl.match(mimePattern)[1];  var binStr = atob(data);  var arr = new Uint8Array(len);
for (var i = 0; i < len; i++) { arr[i] = binStr.charCodeAt(i); } return new Blob([arr], {type: type || mime});}


canvas2Blob(canvas, callback, quality, type)


HTMLCanvasElement 有 toBlob(callback, [type], [encoderOptions]) 方法創(chuàng)造 Blob 對(duì)象,用以展示 canvas 上的圖片;


這個(gè)圖片文件可以被緩存或保存到本地,由用戶代理端自行決定。


第二個(gè)參數(shù)指定圖片格式,如不特別指明,圖片的類型默認(rèn)為 image/png,分辨率為 96dpi。


第三個(gè)參數(shù)用于針對(duì)image/jpeg 格式的圖片進(jìn)行輸出圖片的質(zhì)量設(shè)置。? ? ?


function?canvas2Blob(canvas,?callback,?quality,?type){  canvas.toBlob(function(blob) {    callback(blob);  }, type || 'image/jpeg', quality || 0.8);}


為兼容低版本瀏覽器,作為 toBlob 的 polyfill 方案,可以用上面 data URL 生成 Blob 方法 dataUrl2Blob 作為HTMLCanvasElement 原型方法。? ? ? ? ? ? ? ?

if?(!HTMLCanvasElement.prototype.toBlob)?{ Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', {  value: function (callback, type, quality) {    let dataUrl = this.toDataURL(type, quality);    callback(dataUrl2Blob(dataUrl));  } });}


blob2DataUrl(blob, callback)


將 Blob 對(duì)象轉(zhuǎn)化成 data URL 數(shù)據(jù),由于 FileReader 的實(shí)例 readAsDataURL 方法不僅支持讀取文件,還支持讀取 Blob 對(duì)象數(shù)據(jù),這里復(fù)用上面 file2DataUrl 方法即可:? ? ? ??


function?blob2DataUrl(blob,?callback)?{  file2DataUrl(blob, callback);}


blob2Image(blob, callback)


將 Blob 對(duì)象轉(zhuǎn)化成 Image 對(duì)象,可通過(guò) URL 對(duì)象引用文件,也支持引用 Blob 這樣的類文件對(duì)象,同樣,這里復(fù)用上面 file2Image 方法即可:? ? ? ? ? ? ? ?

function?blob2Image(blob,?callback)?{  file2Image(blob, callback);}


upload(url, file, callback)


上傳圖片(已壓縮),可以使用 FormData 傳入文件對(duì)象,通過(guò) XHR 直接把文件上傳到服務(wù)器。? ? ? ? ? ? ??


function?upload(url,?file,?callback)?{  var xhr = new XMLHttpRequest();  var fd = new FormData();  fd.append('file', file);  xhr.onreadystatechange = function () {    if (xhr.readyState === 4 && xhr.status === 200) {      // 上傳成功      callback && callback(xhr.responseText);    } else {      throw new Error(xhr);    }  }  xhr.open('POST', url, true);  xhr.send(fd);}


也可以使用 FileReader 讀取文件內(nèi)容,轉(zhuǎn)化成二進(jìn)制上傳? ? ? ? ? ? ? ?


function?upload(url,?file)?{  var reader = new FileReader();  var xhr = new XMLHttpRequest();
xhr.open('POST', url, true); xhr.overrideMimeType('text/plain; charset=x-user-defined-binary');
reader.onload = function() { xhr.send(reader.result); }; reader.readAsBinaryString(file);}


實(shí)現(xiàn)簡(jiǎn)易圖片壓縮


在熟悉以上各種圖片轉(zhuǎn)化方法的具體實(shí)現(xiàn),將它們封裝在一個(gè)公用對(duì)象 util 里,再結(jié)合壓縮轉(zhuǎn)化流程圖,這里我們可以簡(jiǎn)單實(shí)現(xiàn)圖片壓縮了:


首先將上傳圖片轉(zhuǎn)化成 Image 對(duì)象,再將寫入到 Canvas 畫布,最后由 Canvas 對(duì)象 API 對(duì)圖片的大小和尺寸輸出調(diào)整,實(shí)現(xiàn)壓縮目的。??


/** * 簡(jiǎn)易圖片壓縮方法 * @param {Object} options 相關(guān)參數(shù) */(function (win) {  var REGEXP_IMAGE_TYPE = /^image\//;  var util = {};  var defaultOptions = {    file: null,    quality: 0.8  };  var isFunc = function (fn) { return typeof fn === 'function'; };  var isImageType = function (value) { return REGEXP_IMAGE_TYPE.test(value); };
/** * 簡(jiǎn)易圖片壓縮構(gòu)造函數(shù) * @param {Object} options 相關(guān)參數(shù) */ function SimpleImageCompressor(options) { options = Object.assign({}, defaultOptions, options); this.options = options; this.file = options.file; this.init(); }
var _proto = SimpleImageCompressor.prototype; win.SimpleImageCompressor = SimpleImageCompressor;
/** * 初始化 */ _proto.init = function init() { var _this = this; var file = this.file; var options = this.options;
if (!file || !isImageType(file.type)) { console.error('請(qǐng)上傳圖片文件!'); return; }
if (!isImageType(options.mimeType)) { options.mimeType = file.type; }
util.file2Image(file, function (img) { var canvas = util.image2Canvas(img); file.width = img.naturalWidth; file.height = img.naturalHeight; _this.beforeCompress(file, canvas);
util.canvas2Blob(canvas, function (blob) { blob.width = canvas.width; blob.height = canvas.height; options.success && options.success(blob); }, options.quality, options.mimeType) }) }
/** * 壓縮之前,讀取圖片之后鉤子函數(shù) */ _proto.beforeCompress = function beforeCompress() { if (isFunc(this.options.beforeCompress)) { this.options.beforeCompress(this.file); } }
// 省略 `util` 公用方法定義 // ...
// 將 `util` 公用方法添加到實(shí)例的靜態(tài)屬性上 for (key in util) { if (util.hasOwnProperty(key)) { SimpleImageCompressor[key] = util[key]; } }})(window)


這個(gè)簡(jiǎn)易圖片壓縮方法調(diào)用和入?yún)ⅲ? ? ? ? ?


var?fileEle?=?document.getElementById('file');
fileEle.addEventListener('change', function () { file = this.files[0];
var options = { file: file, quality: 0.6, mimeType: 'image/jpeg', // 壓縮前回調(diào) beforeCompress: function (result) { console.log('壓縮之前圖片尺寸大小: ', result.size); console.log('mime 類型: ', result.type); // 將上傳圖片在頁(yè)面預(yù)覽 // SimpleImageCompressor.file2DataUrl(result, function (url) { // document.getElementById('origin').src = url; // }) }, // 壓縮成功回調(diào) success: function (result) { console.log('壓縮之后圖片尺寸大小: ', result.size); console.log('mime 類型: ', result.type); console.log('壓縮率:', (result.size / file.size * 100).toFixed(2) + '%');
// 生成壓縮后圖片在頁(yè)面展示 // SimpleImageCompressor.file2DataUrl(result, function (url) { // document.getElementById('output').src = url; // })
// 上傳到遠(yuǎn)程服務(wù)器 // SimpleImageCompressor.upload('/upload.png', result); } };
new SimpleImageCompressor(options);}, false);


如果看到這里的客官不嫌棄這個(gè) demo 太簡(jiǎn)單可以戳這里試試水。如果你有足夠的耐心多傳幾種類型圖片就會(huì)發(fā)現(xiàn)還存在如下問(wèn)題:


壓縮輸出圖片寸尺固定為原始圖片尺寸大小,而實(shí)際可能需要控制輸出圖片尺寸,同時(shí)達(dá)到尺寸也被壓縮目的;


png 格式圖片同格式壓縮,壓縮率不高,還有可能出現(xiàn)“不減反增”現(xiàn)象;


有些情況,其他格式轉(zhuǎn)化成 png 格式也會(huì)出現(xiàn)“不減反增”現(xiàn)象;


大尺寸 png 格式圖片在一些手機(jī)上,壓縮后出現(xiàn)“黑屏”現(xiàn)象;



改進(jìn)版圖片壓縮


俗話說(shuō)“羅馬不是一天建成的”,通過(guò)上述實(shí)驗(yàn),我們發(fā)現(xiàn)了很多不足,下面將逐條問(wèn)題分析,尋求解決方案。


壓縮輸出圖片寸尺固定為原始圖片尺寸大小,而實(shí)際可能需要控制輸出圖片尺寸,同時(shí)達(dá)到尺寸也被壓縮目的;


為了避免壓縮圖片變形,一般采用等比縮放,首先要計(jì)算出原始圖片寬高比 aspectRatio,


用戶設(shè)置的高乘以 aspectRatio,得出等比縮放后的寬,若比用戶設(shè)置寬的小,則用戶設(shè)置的高為為基準(zhǔn)縮放,否則以寬為基準(zhǔn)縮放。? ?


var aspectRatio = naturalWidth / naturalHeight;var width = Math.max(options.width, 0) || naturalWidth;var height = Math.max(options.height, 0) || naturalHeight;if (height * aspectRatio > width) {  height = width / aspectRatio;} else {  width = height * aspectRatio;}


輸出圖片的尺寸確定了,接下來(lái)就是按這個(gè)尺寸創(chuàng)建一個(gè) Canvas 畫布,將圖片畫上去。這里可以將上面提到的 image2Canvas 方法稍微做一下改造:? ? ? ? ? ? ? ?


function?image2Canvas(image,?destWidth,?destHeight)?{  var canvas = document.createElement('canvas');  var ctx = canvas.getContext('2d');  canvas.width = destWidth || image.naturalWidth;  canvas.height = destHeight || image.naturalHeight;  ctx.drawImage(image, 0, 0, canvas.width, canvas.height);  return canvas;}


png 格式圖片同格式壓縮,壓縮率不高,還有可能出現(xiàn)“不減反增”現(xiàn)象


一般的,不建議將 png 格式圖片壓縮成自身格式,這樣壓縮率不理想,有時(shí)反而會(huì)造成自身質(zhì)量變得更大。


因?yàn)槲覀冊(cè)凇熬唧w實(shí)現(xiàn)”中兩個(gè)有關(guān)壓縮關(guān)鍵 API:


toBlob(callback, [type], [encoderOptions]) 參數(shù) encoderOptions 用于針對(duì)image/jpeg 格式的圖片進(jìn)行輸出圖片的質(zhì)量設(shè)置;


toDataURL(type, encoderOptions 參數(shù)encoderOptions 在指定圖片格式為 image/jpeg 或 image/webp 的情況下,可以從 0 到 1 的區(qū)間內(nèi)選擇圖片的質(zhì)量。


均未對(duì) png 格式圖片有壓縮效果。


有個(gè)折衷的方案,我們可以設(shè)置一個(gè)閾值,如果 png 圖片的質(zhì)量小于這個(gè)值,就還是壓縮輸出 png 格式,這樣最差的輸出結(jié)果不至于質(zhì)量太大,


在此基礎(chǔ)上,如果壓縮后圖片大小 “不減反增”,我們就兜底處理輸出源圖片給用戶。當(dāng)圖片質(zhì)量大于某個(gè)值時(shí),我們壓縮成 jpeg 格式。? ? ? ? ? ? ? ?


//?`png`?格式圖片大小超過(guò)?`convertSize`,?轉(zhuǎn)化成?`jpeg`?格式if (file.size > options.convertSize && options.mimeType === 'image/png') {  options.mimeType = 'image/jpeg';}// 省略一些代碼// ...// 用戶期待的輸出寬高沒(méi)有大于源圖片的寬高情況下,輸出文件大小大于源文件,返回源文件if (result.size > file.size && !(options.width > naturalWidth || options.height > naturalHeight)) {  result = file;}


大尺寸 png 格式圖片在一些手機(jī)上,壓縮后出現(xiàn)“黑屏”現(xiàn)象


由于各大瀏覽器對(duì) Canvas 最大尺寸支持不同



如果圖片尺寸過(guò)大,在創(chuàng)建同尺寸畫布,再畫上圖片,就會(huì)出現(xiàn)異常情況,即生成的畫布沒(méi)有圖片像素,而畫布本身默認(rèn)給的背景色為黑色,這樣就導(dǎo)致圖片“黑屏”情況。


//?...// 限制最小和最大寬高var maxWidth = Math.max(options.maxWidth, 0) || Infinity;var maxHeight = Math.max(options.maxHeight, 0) || Infinity;var minWidth = Math.max(options.minWidth, 0) || 0;var minHeight = Math.max(options.minHeight, 0) || 0;
if (maxWidth < Infinity && maxHeight < Infinity) { if (maxHeight * aspectRatio > maxWidth) { maxHeight = maxWidth / aspectRatio; } else { maxWidth = maxHeight * aspectRatio; }} else if (maxWidth < Infinity) { maxHeight = maxWidth / aspectRatio;} else if (maxHeight < Infinity) { maxWidth = maxHeight * aspectRatio;}
if (minWidth > 0 && minHeight > 0) { if (minHeight * aspectRatio > minWidth) { minHeight = minWidth / aspectRatio; } else { minWidth = minHeight * aspectRatio; }} else if (minWidth > 0) { minHeight = minWidth / aspectRatio;} else if (minHeight > 0) { minWidth = minHeight * aspectRatio;}
width = Math.floor(Math.min(Math.max(width, minWidth), maxWidth));height = Math.floor(Math.min(Math.max(height, minHeight), maxHeight));
// ...// 覆蓋默認(rèn)填充顏色 (#000)var fillStyle = 'transparent';context.fillStyle = fillStyle;


這里可以通過(guò)控制輸出圖片最大寬高防止生成畫布越界,并且用透明色覆蓋默認(rèn)黑色背景解決解決“黑屏”問(wèn)題:? ? ? ? ? ? ? ?


到這里,上述的意外問(wèn)題被我們一一解決了。


總 結(jié)


我們梳理了通過(guò)頁(yè)面標(biāo)簽 上傳本地圖片到圖片被壓縮整個(gè)過(guò)程,也覆蓋到了在實(shí)際使用中還存在的一些意外情況,提供了相應(yīng)的解決方案。


將改進(jìn)版圖片壓縮整理成插件,已上傳 npm ,可通過(guò) npm install js-image-compressor -D 安裝使用,可以從 github 下載。


整理匆忙,如有問(wèn)題歡迎大家指正,完~


瀏覽 45
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 亚洲AV无码乱码| 天天插天天狠| 欧美黄片一区| 亚洲精品成人无码毛片| 人人爱人人草| 尤物一区二区| 麻豆秘在线观看国产| 嘉兴少妇按摩69XX| 黄色小视频在线免费观看| 免费一级电影| 国产最新在线视频| TheAV精尽人亡av| 蜜桃av秘无码一区三| 成人三级电影在线观看| 国产精品一二| 精品精品视频| 欧美亚洲成人在线观看| 亚洲熟女视频| 香蕉久久国产AV一区二区| 日韩成人无码片| 91久九九| 亚洲国产免费| 久久天堂| 国产精品一区二区三区不卡| 亚洲日韩欧美一区二区天天天| 天天综合国产| 黑人vs亚洲人在线播放| 日本一区二区在线视频| 在线播放一区| 国产主播在线观看| 国产精品伊人| 伊人大香蕉综合在线| 99视频在线播放| 国产欧美激情| 七十路の高齢熟女千代子下载 | 无码人妻丰满熟妇区毛片视频| 影音先锋av在线资源站| 18成人网站在线观看| 精品人妻午夜一区二区三区四区 | 一级a一级a爰片免费免免在线| 久热亚洲| 香蕉成人电影| 婷婷成人小说| 久久久久久91| 国产乱国产乱老熟300部视频| 亚洲三级无码视频| 日韩一级片免费观看| 亚洲综合电影| 色五月天导航| 亚洲AV大片| 日日夜夜干| 国产做受| 日本五十路熟女视频| 中文字幕乱伦| 欧美国产精品一区二区三区| 在线观看黄色AV| 欧美自拍视频| 欧美一级欧美三级在线观看| 亚洲vs无码秘蜜桃少妇| 特黄特色一级特黄大片| 国产AV大片| 日韩人妻无码一区二区三区七区| 亚洲精品久久久久毛片A级绿茶| 淫香淫色综合网| 日韩v欧美v日本v亚洲v国产v| 狠狠躁日日躁夜夜躁A片小说免费| 亚洲视频一区二区三区| 欧美一区二区三区在线播放| 中文字幕久久人妻无码精品蜜桃| 性爱视频91| 噜噜噜久久久| 在线一级片| 免费观看黄片网站| 男人天堂v| 亚洲色成人中文字幕在线| 中文字幕无码亚| 国产一级特黄aaa大片| 国产精品久久久999| 久久草成人网| 熟妇槡BBBB槡BBBB图| 无码天堂| h片网站在线观看| 天天操天天操天天操| 操逼视频一级| 黄色日逼| 成人福利视频在线观看| 日韩无码毛片| 东方av在线免费观看| 国产黄色av| www.五月天| 99热在线观看| 九九九九国产| 狠狠AV| 欧美亚洲一区二区三区| 国产成人小视频在线观看| 免费操| 网站av| 成人做爰黄AAA片免费直播岛国 | 日无码在线| 丁香五月欧美激情| 亚洲91无码精品一区在线播放| 99综合久久| 99热都是精品| 91人妻无码视频| www.日本黄色视频| 五月天av在线| 性爱A级视频| 成人做爰黄AAA片免费直播岛国| 久久久aaa| 久久91欧美特黄A片| 国产噜噜噜噜噜久久久久久久久| 亚洲精品成人无码毛片| 久久久久久亚洲AV黄床| 色色a| 日韩午夜片| 欧美黄视频| 午夜专区| 97超碰免费| 麻豆自拍偷拍视频| 婷婷色777777| 美女黄色网| 影音先锋AV资源网站| 亚洲无码AV在线播放| 日本一区二区精品| 97操逼| 精品一区二区三区四区五区六区七区八区九区 | 综合国产| 91av免费看| 国产成人精品三级麻豆| 91.n| 久久三级视频| 午夜男人天堂| 成年人免费看视频| 毛片久久| 大香蕉大香蕉网| 999高清无码| 能看的av网站| 婷婷五月伊人| 在线播放你懂的| 在线免费观看网站| 国产美女网站| 荫蒂添出高潮A片视频| 在桌下含她的花蒂和舌头H视频| 操逼视频免费| 99精品视频免费| 免费在线观看黄色网址| 91人妻无码一区二区三区| 夜夜福利| av在线影院| 亚洲欧美日韩一区二区| 久精久久| 亚洲成人少妇老妇a视频在线| 成人啪啪网站| 亚洲国产成人视频| 国产中文字幕亚洲综合欧美| 成人性爱免费视频| 一级黄色免费视频| 久久青青婷婷| 午夜成人在线观看| 精品日逼| 午夜成人黄色| 国产乱妇无码毛片A片在线看下载 日韩电影免费在线观看中文字幕 欧美性爱中文字幕 | 小黄片免费| 国产精品S色| 2012天天夜夜| 天堂中文网| 乱伦小视频| 亚洲理论在线| 国产精品久久久久野外| 91毛片在线观看| 成人中文字幕网站| 91无码人妻| 91老熟女视频| 国产aaaa| 高清的日逼| 五月天中文字幕| 亚洲最大黄色视频| 国产一级片无码| 男人AV网| 欧美成人精品一区二区三区| 一级特黄录像免费播放下载软件 | 黄片欧美| 微拍福利一区二区| yw尤物| 亚洲专区在线播放| 亚洲第一黄色视频| 夜夜爽夜夜爽| 91在线精品秘一区二区黄瓜| 亚洲成av人无码| 亚洲尤物在线| 欧美熟妇另类久久久久久不卡| 欧美国产在线观看综合| 一级A片一毛片大全| 午夜福利1000| 99激情网| 午夜AV免费| 欧美中文字幕在线| www.天天操| 欧美色视频一区二区三区在线观看| 国产成人V在线精品一区| 99热国产| 午夜精品18| 欧美黄片一区| 婷婷五月中文| 久久精品99国产国产精| 天天爽夜夜爽精品成人免费| 刘玥91精品一区二区三区| 国产高清精品软件丝瓜软件| 处破女初破全过免费看| 日韩群交视频| 日韩精品黄片| 人人操碰人人| 国内久久| 米奇色色| 操逼电影| 亚洲成人无码av| 久久精品秘一区二区三免费| 日韩精品视频免费| 欧美色啪| 男女啪啪网站| 亚洲精品99| 麻豆国产一区二区三区四区| 91AV免费观看| 中文字幕A片| 国产又爽又黄视频| 国产成人内射| 污视频在线观看免费| 91天天综合| 国产人妻| 成人免费黄色| 亚洲视频在线免费播放| AV大全在线观看| 欧美sesese| 婷婷精品免费| 亚洲一二三四区| 1024手机在线视频| 日韩肏屄网| 人人狠狠综合婷婷| 日韩无码高清视频| 成人在线免费观看视频| 伊人久操| 日韩毛| 国精产品一区一区三区| 粉粉嫩嫩的18虎白女| 婷婷五月天综合| 在线观看的av网站| 亚洲码无人客一区二区三区| 欧美日韩无码视频| 逼逼影院| 国产人体视频| 日韩啊啊啊| 人妻精品免费| 免费在线观看无码| 最近中文字幕在线观看| 在线观看中文字幕网站| 日韩一级免费观看| 久草香蕉| 熟女伦乱| 国产在线拍揄自揄拍无码男男 | 亚洲www| 操B网站| 三级视频在线播放| 亚洲五月婷婷| 就去se超碰| 日韩人妻无码专区一区二区| 最新97色黄色精品高清网站| 天堂网址激情网址| 深爱激情综合| 欧美熟女一区二区| 国产激情精品视频| 91福利影院| 婷婷丁香五月网| aV一区二区三区| 欧美69成人| 久久综合色色| 自拍偷拍亚洲无码| 国产中文字幕av| 亚洲精品视频免费在线观看| 中文字幕日本精品5| 久久另类TS人妖一区二区| 婷婷五月欧美| 亚洲日本黄色视频| 911精品国产一区二区在线 | 在线亚洲色图| 日皮在线观看| 农村一级婬片A片AAA毛片古装| 黄色三级毛片| 久久久999久久久999精神| 米奇色色| 欧美三级在线播放| 成人AV免费观看| 激情五月色五月| 日本色情在线| 久久久久久久9999| 安徽妇搡BBBB搡BBBB按摩| 中文字幕av第一页| 精品码一区二在线观看| a在线免费观看| 色接久久| 91大神免费在线观看| 人人操人人摸人人射| 人成视频免费观看| 国产99页| 色综合中文字幕| 伊人88| 久久性爱网站| 黑巨茎大战欧美白妞| 一区二区Av| 国产日韩欧美久久| 中文字幕免费观看视频| 又黄又爽无遮挡| 无码精品人妻一区二区三区漫画| 日本免费A片| 亚洲AV无码一区二区三区少妇| 黄色高清视频在线观看| 日本免费黄色小视频| 日韩乱伦中文字幕| 韩国一级av| www.男人的天堂| 国产精品视频一区二区三区在线观看 | 五月天婷婷丁香| 农村新婚夜一级A片| 国产AV一卡| 靠逼网站免费观看| 亚洲中文字幕不卡| 人人看人人做| 久久6| igao在线观看| 中文字幕免费MV第一季歌词| 精品视频免费观看| 人人操人人摸人人干| 瘦精品无码一区二区三区四区五区六区七区八区 | 欧亚精品视频| 国产精品无码在线播放| 98色色| 做爱的网站| 大香蕉色视频| 国产精品一级a毛一级a| 无码人妻av黄色一区二区三区| 日本大胆中出| 嫩BBB槡BBBB槡BBBB二一| 想要xx在线观看| 肏屄免费视频| 国产美女网站| 91人妻日韩人妻无码| 美女网站在线观看| 影音先锋资源| 成人毛片一区二区三区无码| 99免费在线观看视频| 黄色性爱小说| 老太奶性BBwBBw侧所| 精品精品精品| 韩国三级HD中文字幕的背景音乐| 91香蕉视频在线播放| 亚洲天堂网2025| 可以免费看AV的网站| 亚洲无码网站| 国产又爽又黄A片| 97人妻人人澡人人爽人人精品| 久久久久亚洲AV成人片乱码| 中文字幕性爱| 婷婷午夜| 国产精品人人| 性爱av在线| 欧美精品A级片| 天天日综合网| 欧美日韩视频在线播放| 男女网站在线观看| 中文字幕在线电影| 一区二区三区久久| 最近日本中文字幕中文翻译歌词 | 黑人巨大精品欧美| A片网| 另类Av| 亚洲性爱AV| 日韩在线女优天天干| 免费亲子乱婬一级A片| 激情五月天亚洲| 中文字幕乱码中文字乱码影响大吗| www.伊人网| 91在线无码精品秘国产| 蜜桃视频91| 丁香五月婷婷在线| 中文字幕日韩无码片| 亚洲区成人777777精品| 天天日很很日| 欧美一区二区三区成人片下载 | 老妇槡BBBB| 91视频一区二区三区| 亚洲毛片亚洲毛片亚洲毛片| www.91自拍| av三级网站| 亚洲的天堂的αⅴ| 中文字幕精品一级A片| 水蜜桃网址| 91婷婷射| 午夜无码电影| 国产激情视频网站| 91国产精品| 三级片高清无码| 性做久久久久久久久| 51国产黑料吃瓜在线入口| 中国1级毛片| 丰满人妻一区二区三区四区53| 超碰人人在线| 综合色亚洲| 成人午夜大片| 日韩无码视频观看| 自慰喷水流白浆中文字幕| 99re伊人| 麻豆疯狂做受XXXX高潮视频| 91人人妻人人澡| 波多野结衣福利视频| 婷婷精品| 首屈一指视频在线观看| 在线高清无码| 亚洲国产精品午夜福利| 久久婷婷婷| 亚洲一区二区三| 三级片无码在线| 黄色福利视频| 午夜理伦| 高清色视频| jizz在线免费观看| 黄色视频毛片一一| 亚洲成人精品少妇| 日本五十路熟女视频| 嗯啊在线视频| 日韩在线视频一区| 黄色激情五月| 日屄在线观看| 久久水蜜桃| 大香蕉综合久久| 亚洲V在线观看| 欧美性爱91| 九一国产在线| 一本一道vs波多野结衣| 丁香六月综合| 日韩视频91| av不卡在线| AV黑人| 黄片无码| 美女大香蕉| 亚洲色图狠狠撸| 99久久久国产精品无码| 91社区成人影院| 精品九九九| 婷婷五月天网址| 亚洲精品自拍偷拍| 久久成人综合网| 午夜黄色福利| 精品无码人妻一区二区三区 | 黄色视频免费看| 俺去久久| 91蜜桃视频在线观看| 91人妻人人澡人人爽人人DVD| 北京熟妇槡BBBB槡BBBB| 美日韩综合| 东北操逼视频| 久精品视频| 亚洲最大黄色视频| 三级成人AV| 成人在线视频免费观看| 亚洲天堂精品视频| 操美女的网站| 免费毛片网站| 日韩精品人妻无码| 中文字幕丰满的翔田千里| 国产激情视频在线| 免费观看成人| 久久亚洲精品视频| 欧美国产日韩另类| 日韩欧美中文| 中文字幕乱码无码人妻系列蜜桃| 九九九在线观看视频| 麻豆人妻换人妻好紧| 骚逼逼影院| 久久澡| 777在线视频| 风流少妇一区二区三区91| 免费看黄色的网站| 色香蕉视频在线观看| 亚洲中文字幕2025| 天堂色色| 国内精品人妻无码久久久影院蜜桃 | 国产精品99视频| 97精品人妻一区| 神马午夜福利| 一本色道久久综合无码欧美| 在线婷婷| 久久国产高清视频| 球AV在线| 98国产精品| 狠狠干在线观看| 一区二区三区福利| 国产麻豆电影在线观看| 欧美黄色一级视频| 日韩精品人妻中文字幕第4区 | 久在线视频| 日日夜夜精选视频| 人妻无码在线观看| 欧美日韩久久| 大荫蒂HD大荫蒂视频| 久久新视频| 亚洲婷婷在线视频| 亚洲AV无码成人精品区东京热| 国产午夜福利视频| 超碰在线大香蕉| 成人黄色小电影| 竹菊av一区二区三区四区五区| 亚洲免费精品视频| 国内操逼| 福利视频亚洲| 日一日射一射| 国产剧情一区二区三区| 国产黄色视频在线播放| 初学影院WWWBD英语完整版在线观看 | 成人特级毛片全部免费播放 | 亚洲中文字幕成人| 中文字幕有码在线播放| 骚逼影院| a天堂视频| 大香蕉网伊| 日韩无码高清一区| 日本免费黄色小视频| 女人卖婬视频播放| 国产午夜在线视频| 在线内射| 久久国产精品免费视频| 色射爱| 91麻豆国产视频| 无码乱伦AV| 天干天干天夜夜操| a片在线免费观看| 18禁一区二区三区| 国产精品久久精品| 三级片网站视频| 婷婷俺也去| 久久大香蕉网| 伊人大香在线| 国产精品免费久久| 国产特级毛片AAAAAA| 日本黄色的视频| 欧美国产日韩综合在线观看170| 爱干视频| 欧美日韩免费看| 性猛交AAAA片免费看蜜桃视频| 伊人久久中文字幕| 91啦丨露脸丨熟女色啦| 日韩美女在线| 熟女人妻ThePorn| 一区二区三区久久久久| www.99热视频| 人人干人妻| 一区高清| 天天色天天色| 精品人人人| 起碰在线视频| 人人妻人人玩澡人人爽| 色图插插插| 国产传媒AV| 五月天婷婷AV| 精品人妻中文字幕视频| 91精品老司机| 18禁二区| 91在线无码精品秘网站| 大香蕉免费中文| 91人妻人人澡人人爽人人精吕| 色妞视频精品一区| 青榴视频免费观看| 安徽少妇搡bbw搡bbbb| 日韩无码人妻一区二区三区| 99草自拍| 五月六月丁香激情视频| 国产欧美毛片| 中文字幕资源站| 日韩中文字幕成人| 欧美爱爱免费看| 日夜夜操| 国产超级无码高清在线视频观看| 色婷婷7777| 精品久久免费一区二区三区| 嫩BBB槡BBBB槡BBBB二一| 久久久久亚洲AV无码专区| av不卡在线观看| 日本A片在线免费观看| 91麻豆福利| 成人无码免费看| 日韩精品一区二区在线观看| 日本天堂在线| 欧美一级黄色A片| 一级特黄大片录像i| 99在线观看免费视频| 美女被操免费网站| 翔田千里无码| 99久久爱re热6在播放| 午夜精品久久久久久久久无码99热| av天天av无码av天天爽| 精品中文视频| 色色综合热| 国产精品天天| A片黄色电影网站| 五月天婷婷基地| 操逼影视| 欧美手机在线| 午夜成人福利视频在线观看| 一本色道久久88综合无码| 久久久老熟女一区二区三区91| 91理论片| 国产av地址| 无码区一区二区三区| 日逼A片| 无码免费看| 欧美人操逼一二区| 国产精品久久久91| 午夜成人无码视频| 国产A片电影| 欧美第二页| 中文字幕乱码亚州无线码日韩理论电 | 成人自拍视频在线| 欧一美一婬一伦一区二区三区自慰,| av在线资源观看| 国产激情网| 国产福利AV| 人人操人人干人人操| 亚洲日韩在线a成| 免费无码毛片一区二区A片| 无码黄页| 国产又色又爽又黄又免费| 天天看天天操| 六月婷婷深爱| 亚洲成人动漫免费| 黃色一級片黃色一級片尖叫声-百度-百 | 国产成人69免费看| 日韩无码AV一区二区三区| 超碰女人| 91拍真实国产伦偷精品| 99青草在线视频| 日本中文无码| 99久久影院| 午夜不卡视频| 国产成人视频| 久久九九国产精品怡红院| 最近日本中文字幕中文翻译歌词 | 无码欧美人XXXXX日本无码 | 思思热在线视频精品| 青娱乐精品在线| 在线免费观看黄色片| 亚洲精品成人无码| 婚闹不堪入目A片| 亚洲欧美日韩动漫| 亚洲无码成人在线| 色婷婷av| 色播网址| 先锋影音一区二区| 91麻豆国产| 日韩成人视屏| 老司机一区二区| 欧美a级视频| 国产aa| av啊啊| 国产最新地址| 日本成人电影| 五月婷婷俺也去| www.久久久| 翔田千里无码XXXXXX| 成人视频欧美| 无码9999| 五月婷婷六月天| 强奸校花到高潮| 爱爱视频天天操| 777视频在线观看| 亚洲高清视频在线观看| WWW亚洲视频| 狠狠色婷婷777| 91久久久久| 操逼视频91| 精品久久99| 91三级片| 91色在线视频| 无码人妻精品一区二区三区99仓 | 99这里有精品| 国产日韩欧美在线观看| 成人色视| 伊人成年网| 91综合网| 日韩精品无码一区二区三区| 国外成人性视频免费| 麻豆免费视频| 国产特黄级AAAAA片免| 大香蕉欧美在线| 中文字幕在线免费| 香蕉视频啪啪啪| 影音先锋成人资源网| 国产又爽又黄视频| 香蕉伊人视频| 日韩高清在线| 日韩毛片一区二区| 大香蕉操逼网| 狠狠精品| 欧美成人在线视频网站| 欧美九九| 羽月希奶水饱胀在线播放| 插菊花综合网2| 综合网在线| 91久久精品视频| 日韩天堂av| 久99久视频| 欧美成人一区二区| 日本一区免费观看| 成人性爱AV| 精品网站| 天天爽天天射| 亚洲五月激情| 99久久99久久| 91丨牛牛丨国产人妻| 久久一区二区三区四区五区| 婷婷激情五月| 久久公开视频| 大香蕉综合| 乱伦小视频| 嫩草在线观看| 97久久精品| 精品欧美一区二区三区| 久久永久免费| 啪啪免费视频| 午夜人妻AV| 99综合| 欧美黄色成人视频| 欧美成人精品AAA| 逼逼视频| 99热这里只有精品9| 国产字幕| 久久久久久国产| www.日韩一区| 伊人色女操穴综合网| 最新中文字幕在线观看视频| 國產美女AV操逼網站| 精品五月天| 江苏妇搡BBBB搡BBB| 超碰2023| 日本精品一区二区| 欧美精品一卡二卡| 悠悠AV导航| 亚洲日韩中文在线| 开心色播五月| 午夜无码在线| 99精品自拍| 91视频在线看| 99久久精品国产成人一区二区| 精品视频在线播放| 精品人伦一区二区三区| 高潮喷水AⅤ| 五月丁香婷中文| 在线观看小视频| 日韩国产在线| 男人av在线| 黄色片视频日本| 国产精品福利视频| 91嫩操| 成人免费黄| 蜜桃视频网站18| 中字AV| 小日本91在线观看| 视频一区二区三区在线观看| 高清毛片AAAAAAAAA郊外| 操毛| 国产无码AV在线| 国产一区视频在线| 日韩一级a| 欧美成人精品网站| 日韩精品一区二区三免费视频| 丁香婷婷一区二区三区| 中文字幕第23页| 91人妻无码一区二区久久| 怡红院视频| 国产香蕉91| 青青草黄色片| 久久亚洲天堂| 亚洲成人无码网站| 西西444WWW无码视频软件功能介绍| 欧美综合激情| 国产多人搡BBBB槡BBBB| 西西444WWW无码大胆在线观看 | 亚欧三级| 欧美视频久久| 悠悠AV导航| 91人妻无码精品一区二区| 五月天婷婷影院影院| 亚洲欧美国产另类| 欧美精品成人| 欧美成人免费A级在线观看| 中国老少配BBwBBwBBW| 91人妻人人澡人人爽| 国产免费看片| 你懂得在线视频| 美女视频黄a视频全免费不卡| 东京热视频网| 可以在线观看的AV| 日韩无码一| 日本成人不卡视频| 日韩免费高清视频| 欧美搡BBBB搡BBB| yw尤物在线| 午夜无码鲁丝片午夜精品一区二区| 在线观看亚洲天堂| 成人AV十八亚洲二区| 亚洲女同在线| 18禁二区| 大鸡巴在线视频| 天天综合网久久综合网| 中文字幕日韩亚洲| 国产超级无码高清在线视频观看| 色婷婷网| 男女无码| 美女黄色片| 日本黄色视频在线免费观看 | 性九九九九九九| 免费av中文字幕| 安徽少妇搡bbw搡bbbb| 亚洲一级黄色| 中文有码在线| 色婷婷六月| 日本中文不卡| 国产午夜影视| 97精品视频| 91丨九色丨熟女老版| 成人精品无码免费视频| 国产黄色视频免费在线观看| 国产精品嫩草久久久久yw193 | 久久看片| 大香蕉伊人手机在线| 约操少妇| 91国产爽黄在线相亲| 日本A在线| 成人无码区免费A片在线软件| 午夜人妻AV| 国产一级做a爱免费视频| 成人在线91| av资源在线| 亚洲手机在线| 一级av片| av网站免费看| 日韩成人无码免费视频| 欧美不卡一区二区| 性爱A级视频| 国产伦子伦一级A片免费看老牛| AV日逼网| 中文字幕一区二区无码成人| 久久凹凸视频| 国产婷婷色一区二区在线观看| 日本无码在线视频| 人人干人人上| 久久精品波多野结衣| 亚洲熟妇在线观看| 成年人视频在线观看免费| 永久免费看A人片无码精| 视频一区在线观看| 亚洲日韩久久| 人人操AV| 91做爱| 麻豆成人无码精品视频| 大香蕉精品在线视频| 欧美一级棒| 亚洲免费毛片| 一区二区三区精品无码| 成人在线激情| 蜜桃Av噜噜| 国产女人18水真多18精品| 日本一区二区三区四区在线观看| 夏目あきら被续侵犯7天| 成人视频欧美| 中文字幕人妻精品一区| 亚洲草逼视频| 精品九九九| 亚洲无码免费| 国产一区二区三区在线| 国产小视频在线观看| 久久精品在线视频| 久久av电影| 大色欧美| 操逼免费| 91视频亚洲| 欧美不卡视频| 国产黄色免费看| 大香蕉777| 99国产精品| 91福利在线观看| 婷婷五月天色| 99热精品在线| 中文字幕观看av| 88海外华人免费一区| 阿拉伯三级片| 中文字幕性| 欧美精品欧美精品系列| 久久久久久久久成人| 日本少妇BBw| aV一区二区三区| 亚洲秘无码一区二区三区电影| 国产又爽又黄A片|