兼容IE8的摄像头拍照上传
作者: 阿蒙 时间: 2017-11-10 标签: JavaScript 浏览: 2787 评论: 0
比较好用的是jquery.webcam.js. 下面是官网的例子。 官网下载地址 jquery.webcam.js
<div id="webcam"></div>
<button id="take-photo">点击拍照</button>
$(function() {
var pos = 0, ctx = null, saveCB, image = [];
var canvas = document.createElement("canvas");
canvas.setAttribute('width', 320);
canvas.setAttribute('height', 240);
if (canvas.toDataURL) {
ctx = canvas.getContext("2d");
image = ctx.getImageData(0, 0, 320, 240);
saveCB = function(data) {
//支持canvas的高级浏览器
var col = data.split(";");
var img = image;
for(var i = 0; i < 320; i++) {
var tmp = parseInt(col[i]);
img.data[pos + 0] = (tmp >> 16) & 0xff;
img.data[pos + 1] = (tmp >> 8) & 0xff;
img.data[pos + 2] = tmp & 0xff;
img.data[pos + 3] = 0xff;
pos+= 4;
}
if (pos >= 4 * 320 * 240) {
ctx.putImageData(img, 0, 0);
$.post("/upload.php", {type: "data", image: canvas.toDataURL("image/png")});
pos = 0;
}
};
} else {
saveCB = function(data) {
//不支持canvas 一般是IE8及以下
image.push(data);
pos+= 4 * 320;
if (pos >= 4 * 320 * 240) {
$.post("/upload.php", {type: "pixel", image: image.join('|')});
image = []; // 这里是我自己实际运用加的,此代码用户清空image数组,否则形成闭包,数组以图片数量进行递增
pos = 0;
}
};
}
$("#webcam").webcam({
width: 320,
height: 240,
mode: "callback",
swffile: "/download/jscam_canvas_only.swf",
onSave: saveCB,
onCapture: function () {
webcam.save();
},
debug: function (type, string) {
console.log(type + ": " + string);
}
});
$("#take-photo").click(function(){
webcam.capture();
})
});
这里有几点需要注意
1. 谷歌需要在https下打开
2. 拍照生成的data应该是坐标像素对应的RGB值。 在不支持canvas的情况 需要后端转成图片。这里我不太清楚IE8怎样将RGB值转成图片。 有知道的可以和我说一下。 下面是java处理代码(原理大概就是循环遍历然后渲染每个像素的RGB值,PHP原理差不多,就是调用的方法名字不一样)
package com.vic; import com.vic.common.utils.file.ReadFile; import org.junit.Test; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.util.List; import java.util.UUID; /** * Created by vic on 2017/11/9. */ public class ImgTest { @Test public void test() { String filePath = "E:\\img\\test.txt"; //上面生成的字符串 List<String> fileNameList = ReadFile.readFileByLines(filePath); StringBuffer pix = new StringBuffer(); for (String fileNameLine : fileNameList) { pix.append(fileNameLine); } uploadBase32(320, 240, pix.toString()); } /** * base32解码 * * @param w * @param h * @param pix * @return */ public String uploadBase32(int w, int h, String pix) { String savePath = "E:\\img\\"; //图片保留路径 try { BufferedImage bf = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); String[] rows = pix.split("\\|"); for (int i = 0; i < rows.length; i++) { //主要是这里,循环遍历再用setRGB渲染 String[] col = rows[i].split(";"); for (int j = 0; j < col.length; j++) { int data = Integer.parseInt(col[j], 10); bf.setRGB(j, i, data); } } File picPath = new File(savePath); if (!picPath.exists()) { picPath.mkdirs(); } String fileName = UUID.randomUUID().toString() + ".jpg"; savePath += fileName; ImageIO.write(bf, "jpg", new File(savePath)); } catch (Exception e) { e.printStackTrace(); } return null; } }
发表评论: