gpt4 book ai didi

jquery - 网络摄像头图片直接保存到文件附件

转载 作者:行者123 更新时间:2023-12-03 22:51:07 25 4
gpt4 key购买 nike

所以我有一个表单,在这个表单中用户可以上传图片。作为替代方案,我希望他们能够拍照并上传。


现在我认为,当用户使用某种闪存网络摄像头界面拍照时,在用户完成他/她的表单时,该图片需要存储在某种中间存储器中。

有办法解决这个问题吗?最好的解决方案是什么?

我认为实际上只有两个选择。

Either (a) I hold the temporary photo and then accept it again once the form is submitted or (b) the user takes a picture, it's downloaded onto their local machine, and they have to choose it as a file to be submitted again.

这些解决方案都不太令我满意,所以我想知道是否有更好的方法来做到这一点。

编辑: 作为一个额外的好处,虽然它并不真正相关,但我正在使用 Paperclip 制作一个 Rails 应用程序用于文件附件。另外,我更喜欢使用 jQuery...

如果有经验丰富的 UI Web 开发人员提供一般意见就好了。

最佳答案

我用过这个:http://www.xarg.org/project/jquery-webcam-plugin/在我的 Rails 应用程序中,用于从网络摄像头捕获图像。您可以在此处下载此 jQuery 网络摄像头:https://github.com/infusion/jQuery-webcam

这是一个大致完成的实现,对于困惑的代码表示歉意:

class PicturesController < ApplicationController
require 'base64'
def capture
# do something
render :layout => "webcam"
end

def save_image
image = params[:capture][:image]
File.open("#{Rails.root}/public/path_you_want_to_image/image_name.png", 'wb') do |f|
f.write(Base64.decode64(image))
end
# Or use paperclip to save image for a model instead!!
end
end

views/layouts/webcam.html.erb:

<!DOCTYPE html>
<html>
<head>
<title>Application Name</title>
<%= stylesheet_link_tag :all %>
<%= javascript_include_tag :defaults %>
<%= javascript_include_tag "http://www.google-analytics.com/ga.js"%>
<%= javascript_include_tag "http://code.jquery.com/jquery-1.4.2.min.js"%>
<%= javascript_include_tag "jquery.webcam"%>
<script>
!window.jQuery && document.write('<script src="jquery-1.4.3.min.js"><\/script>');
</script>
<%= csrf_meta_tag %>
</head>
<body>
<%= yield %>
</body>
</html>

views/pictures/capture.html.erb:

  <div id="webcam">
<p>Capture image here!</p>
</div>

<%= form_for(save_image_pictures_path, :method => "post", :remote => true) do |f|%>
<%= hidden_field(:item, :sku)%>
<div id="capture_images"><input id="capture_image" type="hidden" value="" name="capture[image]"></div>
<%= submit_tag "Capture Image", :onClick=>"javascript:capture_image();"%>
<% end %>
<%= link_to "Back", root_path %>
<p>
<canvas id="canvas" width="320" height="240"></canvas>
</p>

<script type="text/javascript">

var pos = 0;
var ctx = null;
var cam = null;
var image = null;

var filter_on = false;
var filter_id = 0;

function changeFilter() {
if (filter_on) {
filter_id = (filter_id + 1) & 7;
}
}

function capture_image(){
webcam.capture();
changeFilter();
void(0);
var canvas = document.getElementById('canvas')
var context = canvas.getContext("2d");
var img = canvas.toDataURL("image/png");
var item_image = img.replace(/^data:image\/(png|jpg);base64,/, "") ;
document.getElementById('capture_images').innerHTML="<input id=\"capture_image\" type=\"hidden\" value=\""+item_image+"\" name=\"capture[image]\">";
}

function toggleFilter(obj) {
if (filter_on =!filter_on) {
obj.parentNode.style.borderColor = "#c00";
} else {
obj.parentNode.style.borderColor = "#333";
}
}

jQuery("#webcam").webcam({

width: 320,
height: 240,
mode: "callback",
swffile: "/javascripts/jscam_canvas_only.swf",

onTick: function(remain) {

if (0 == remain) {
jQuery("#status").text("Cheese!");
} else {
jQuery("#status").text(remain + " seconds remaining...");
}
},

onSave: function(data) {

var col = data.split(";");
var img = image;

if (false == filter_on) {

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;
}

} else {

var id = filter_id;
var r,g,b;
var r1 = Math.floor(Math.random() * 255);
var r2 = Math.floor(Math.random() * 255);
var r3 = Math.floor(Math.random() * 255);

for(var i = 0; i < 320; i++) {
var tmp = parseInt(col[i]);

/* Copied some xcolor methods here to be faster than calling all methods inside of xcolor and to not serve complete library with every req */

if (id == 0) {
r = (tmp >> 16) & 0xff;
g = 0xff;
b = 0xff;
} else if (id == 1) {
r = 0xff;
g = (tmp >> 8) & 0xff;
b = 0xff;
} else if (id == 2) {
r = 0xff;
g = 0xff;
b = tmp & 0xff;
} else if (id == 3) {
r = 0xff ^ ((tmp >> 16) & 0xff);
g = 0xff ^ ((tmp >> 8) & 0xff);
b = 0xff ^ (tmp & 0xff);
} else if (id == 4) {

r = (tmp >> 16) & 0xff;
g = (tmp >> 8) & 0xff;
b = tmp & 0xff;
var v = Math.min(Math.floor(.35 + 13 * (r + g + b) / 60), 255);
r = v;
g = v;
b = v;
} else if (id == 5) {
r = (tmp >> 16) & 0xff;
g = (tmp >> 8) & 0xff;
b = tmp & 0xff;
if ((r+= 32) < 0) r = 0;
if ((g+= 32) < 0) g = 0;
if ((b+= 32) < 0) b = 0;
} else if (id == 6) {
r = (tmp >> 16) & 0xff;
g = (tmp >> 8) & 0xff;
b = tmp & 0xff;
if ((r-= 32) < 0) r = 0;
if ((g-= 32) < 0) g = 0;
if ((b-= 32) < 0) b = 0;
} else if (id == 7) {
r = (tmp >> 16) & 0xff;
g = (tmp >> 8) & 0xff;
b = tmp & 0xff;
r = Math.floor(r / 255 * r1);
g = Math.floor(g / 255 * r2);
b = Math.floor(b / 255 * r3);
}

img.data[pos + 0] = r;
img.data[pos + 1] = g;
img.data[pos + 2] = b;
img.data[pos + 3] = 0xff;
pos+= 4;
}
}

if (pos >= 0x4B000) {
ctx.putImageData(img, 0, 0);
pos = 0;
}

},

onCapture: function () {
webcam.save('/product_capture');

jQuery("#flash").css("display", "block");
jQuery("#flash").fadeOut(100, function () {
jQuery("#flash").css("opacity", 1);
});

},

debug: function (type, string) {
jQuery("#status").html(type + ": " + string);
},

onLoad: function () {

var cams = webcam.getCameraList();
for(var i in cams) {
jQuery("#cams").append("<li>" + cams[i] + "</li>");
}
}
});

function getPageSize() {

var xScroll, yScroll;

if (window.innerHeight && window.scrollMaxY) {
xScroll = window.innerWidth + window.scrollMaxX;
yScroll = window.innerHeight + window.scrollMaxY;
} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
xScroll = document.body.scrollWidth;
yScroll = document.body.scrollHeight;
} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
xScroll = document.body.offsetWidth;
yScroll = document.body.offsetHeight;
}

var windowWidth, windowHeight;

if (self.innerHeight) { // all except Explorer
if(document.documentElement.clientWidth){
windowWidth = document.documentElement.clientWidth;
} else {
windowWidth = self.innerWidth;
}
windowHeight = self.innerHeight;
} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
windowWidth = document.documentElement.clientWidth;
windowHeight = document.documentElement.clientHeight;
} else if (document.body) { // other Explorers
windowWidth = document.body.clientWidth;
windowHeight = document.body.clientHeight;
}

// for small pages with total height less then height of the viewport
if(yScroll < windowHeight){
pageHeight = windowHeight;
} else {
pageHeight = yScroll;
}

// for small pages with total width less then width of the viewport
if(xScroll < windowWidth){
pageWidth = xScroll;
} else {
pageWidth = windowWidth;
}

return [pageWidth, pageHeight];
}

window.addEventListener("load", function() {

jQuery("body").append("<div id=\"flash\"></div>");

var canvas = document.getElementById("canvas");

if (canvas.getContext) {
ctx = document.getElementById("canvas").getContext("2d");
ctx.clearRect(0, 0, 320, 240);

var img = new Image();
img.src = "/images/rails.png";
img.onload = function() {
ctx.drawImage(img, 129, 89);
}
image = ctx.getImageData(0, 0, 320, 240);
}

var pageSize = getPageSize();
jQuery("#flash").css({ height: pageSize[1] + "px" });

}, false);

window.addEventListener("resize", function() {

var pageSize = getPageSize();
jQuery("#flash").css({ height: pageSize[1] + "px" });

}, false);
</script>

只需确保 jquery.webcam.js 中引用的“jscam.swf”文件已正确加载到页面上。

您可以在routes.rb中定义的路线是:

resources :pictures do
collection do
get 'capture'
post 'save_image'
end
end

从这里,您可以使用:https://github.com/blueimp/jQuery-File-Upload使用 Ajax 表单提交来上传!!

如果您有任何疑问,请告诉我。

关于jquery - 网络摄像头图片直接保存到文件附件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10309415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com