当图片很大,直接把图片从Server下载到浏览器上看是一种很不明智的做法,浪费了服务器的资源,网络带宽和客户端的资源。所以,通常Server和Client之间会传输缩略图,只有当Client请求某张图片的大图时,Server才会把原图发送过来。这样带来的另外一个好处是,Server可以一次性传输多张缩略图。

追本溯源,Server端的图片也是由Client端Upload上去的,那么是由Server创建缩略图还是Client来创建缩略图并上传,其实有很多讨论,这里我不做展开。基于.NET Core 1.0尚未支持Image的前提下,由Client端来创建缩略图是当下不得不采用的方法。

用JavaScript创建图片的缩略图有很多种,这里只简单描述我研究过的几种。

  • EXIF信息中包含了缩略图
    图片格式有很多,但是严谨意义的EXIF信息会包含缩略图,尤其是用RAW格式为主打的专业图片。这些RAW图片转换为JPG时,默认也会有EXIF的缩略图。
function getThumbnail(file) {
if (file.type === "image/jpeg") {
var reader = new FileReader();
reader.onload = function (e) {
var array = new Uint8Array(e.target.result), start, end;
for (var i = 2; i < array.length; i++) {
if (array[i] === 0xFF) {
if (!start) {
if (array[i + 1] === 0xD8) {
start = i;
}
} else {
if (array[i + 1] === 0xD9) {
end = i;
break;
}
}
}
}
if (start && end) {
var urlCreator = window.URL || window.webkitURL;
var imageUrl = urlCreator.createObjectURL(new Blob([array.subarray(start, end)], {type:"image/jpeg"}));
var imgf = new Image();
imgf.src = imageUrl;
document.body.appendChild(imgf);
}
};
reader.readAsArrayBuffer(file.slice(0, 50000));
}
}
  • 通过FileReader API来绘制缩略图

HTML代码:

<input name="imagefile[]" type="file" id="takePictureField" accept="image/*" onchange="uploadPhotos(targetUrl)" />

JS代码如下:

window.uploadPhotos = function(url){
console.log("Upload to URL " + url)
// Read in file
var file = event.target.files[0]; // Ensure it's an image
if(file.type.match(/image.*/)) {
console.log('An image has been loaded'); // Load the image
var reader = new FileReader();
reader.onload = function (readerEvent) {
var image = new Image();
image.onload = function (imageEvent) { // Resize the image
var canvas = document.createElement('canvas'),
max_size = 544,
width = image.width,
height = image.height;
if (width > height) {
if (width > max_size) {
height *= max_size / width;
width = max_size;
}
} else {
if (height > max_size) {
width *= max_size / height;
height = max_size;
}
}
canvas.width = width;
canvas.height = height;
canvas.getContext('2d').drawImage(image, 0, 0, width, height);
var dataUrl = canvas.toDataURL('image/jpeg');
var resizedImage = dataURLToBlob(dataUrl);
$.event.trigger({
type: "imageResized",
blob: resizedImage,
url: url
});
}
image.src = readerEvent.target.result;
}
reader.readAsDataURL(file);
}
}; /* Utility function to convert a canvas to a BLOB */
var dataURLToBlob = function(dataURL) {
console.log("DataURLToBlob")
var BASE64_MARKER = ';base64,';
if (dataURL.indexOf(BASE64_MARKER) == -1) {
var parts = dataURL.split(',');
var contentType = parts[0].split(':')[1];
var raw = parts[1]; return new Blob([raw], {type: contentType});
} var parts = dataURL.split(BASE64_MARKER);
var contentType = parts[0].split(':')[1];
var raw = window.atob(parts[1]);
var rawLength = raw.length; var uInt8Array = new Uint8Array(rawLength); for (var i = 0; i < rawLength; ++i) {
uInt8Array[i] = raw.charCodeAt(i);
} return new Blob([uInt8Array], {type: contentType});
}
/* End Utility function to convert a canvas to a BLOB */ /* Handle image resized events */
$(document).on("imageResized", function (event) {
console.log("imageResized")
var data = new FormData();
if (event.blob && event.url) { data.append('file', event.blob);
$.ajax({
url: event.url,
data: data,
cache: false,
contentType: false,
processData: false,
type: 'POST',
success: function(data){
console.log("Uploaded")
}
});
}
});

是为之记。
Alva Chien
2016.8.2

JavaScript with Image:创建缩略图的更多相关文章

  1. PHP 创建缩略图

    一.成比例缩小图像 <?php /* 创建缩略图 */ $file = __DIR__.'/button.png'; $scale = 0.5; // 比例 $image = ImageCrea ...

  2. JavaScript 数组的创建

    数组定义:数组(array)是一种数据类型,它包含或者存储了编码的值,每个编码的值称作该数组的一个元素(element), 每个元素的编码被称作为下标(index). JavaScript一维数组创建 ...

  3. php 使用GD库上传图片以及创建缩略图

    php 使用GD库上传图片以及创建缩略图   GD库是PHP进行图象操作一个很强大的库. 先在php.ini里增加一行引用:extension=php_gd2.dll 重启apache.做一个测试页 ...

  4. JavaScript DOM动态创建(声明)Object元素

    http://www.cnblogs.com/GuominQiu/archive/2011/04/01/2002783.html 一文提及“等整个页面加载完毕后,根据用户所选的阅读机类型,再用Java ...

  5. 使用GDI+轻松创建缩略图

    Gdi+ 还是相当好用的. 1> Image保存图像,需要一个CLSID的参数,它可以这样获得: int   GetEncoderClsid(const   WCHAR*   format,   ...

  6. Win+PHP+IECapt完整实现网页批量截图并创建缩略图

    最近在开发一个本地互联网应用的项目,为了增加用户体验,需要在搜索结果左侧显示如图一所示的某个网站的缩略图效果,在网上不停地百度谷歌了一上午后,发现大多数实现少量截图还是可以的,如果大批量的截图总会在中 ...

  7. javascript对象的创建--相对java 怎样去创建了"类"i以及实例化对象

    由于javascript没有java那么多基本类型,同时也没有提供class这个东西,那么我们想实现javascript的对象创建应该怎么办呢,我简单地从w3c提供的课件中提取了一下几种方法: 一.工 ...

  8. c# 创建缩略图

    /// <summary> /// 创建缩略图 /// </summary> /// <param name="srcFileName">< ...

  9. JavaScript对象的创建

    原文 简书原文:https://www.jianshu.com/p/6cb1e7b7e379 大纲 前言 1.简单方式创建对象的方法 2.工厂模式创建对象 3.构造函数模式创建对象 4.原型模式创建对 ...

随机推荐

  1. 机器学习:weka中添加自己的分类和聚类算法

    不管是实验室研究机器学习算法或是公司研发,都有需要自己改进算法的时候,下面就说说怎么在weka里增加改进的机器学习算法. 一 添加分类算法的流程 1 编写的分类器必须继承 Classifier或是Cl ...

  2. std::multiset

    Set.multiset都是集合类, 差别在与set中不允许有重复元素, multiset中允许有重复元素. sets和multiset内部以平衡二叉树实现.   multiset 多重集合容器是一个 ...

  3. linux自启动脚本.sh

    while [ 1 ]; do              PRO_NUM=`ps -ef | grep "cms$" | grep -v "grep" | wc ...

  4. Juc1024小半年总结-面试篇

    大家好,我叫Juc 这大概是我时隔2年度多 第一次以分享的形式发的第一篇公众号 今天是2019年10月26 本想在10月24就分享一下 可惜前面两天时间太忙... 很凑巧,今天我出来工作刚好满4个月, ...

  5. org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping

    配置spring+shiro时,启动tomcat报错异常 严重: Context initialization failedorg.springframework.beans.factory.Bean ...

  6. 百万年薪python之路 -- MySQL数据库之 完整性约束

    MySQL完整性约束 一. 介绍 为了防止不符合规范的数据进入数据库,在用户对数据进行插入.修改.删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数 ...

  7. Eureka error "java.net.UnknownHostException:

    spring cloud 中zuul智能路由,本地部署没有问题,部署到服务器就报com.netflix.zuul.exception.ZuulException: Forwarding error 项 ...

  8. python-写入文件

    一.写入空文件(覆盖) # coding=UTF-8 filename = 'test_text.txt' with open(filename, 'w') as file_object: file_ ...

  9. ssh终端远程登陆主机命令--笔记

    ssh终端远程登陆主机命令 ssh user@host ssh optadmin@10.55.45.38

  10. django-URL实例命名空间(十一)

    每生成一个地址,都是一个实例.使用实例命名空间,针对于一个app而言. book/views.py from django.http import HttpResponse from django.s ...