- 浏览: 23143 次
- 性别:
- 来自: 上海
最近访客 更多访客>>
文章分类
最新评论
-
surpass_li:
真好使一下就搞定了,谢谢分享
Flex/Flash Builder 4.5 下载与破解 -
keete:
要是有源码就赞了。
flash 生成图片上传
首先我们通过flash中的camera对象通过摄像头捕抓图像,存入变量中,然后传递给服务器端(asp.net或asp),服务器端再通过一定的算法对图像每个象素点进行颜色设置,最终还原出flash抓取的图片。
一、 flash部分
1、 捕获视频
1) cmaera.get() 返回对用于捕获视频的 camera 对象的引用。若要实际开始捕获视频,必须将 camera 对象附加到 video 对象
2) video.attachvideo(source) 指定将在舞台上的 video 对象的边界内显示的视频流
参数source: 正在捕获视频数据的 camera 对象,或 netstream 对象。要切断与该 video 对象的连接,请为 source 传递 null.
操作:根据以上两点,我们先来看一个示例:
新建一个新文件mycmaera.fla,在库中右击新建视频,按下图设置
从库中将my_video拖入到场景中,设置其属性名为my_video,在场景第一帧输入以下代码:
mycamera=camera.get();//捕获系统摄像头视频
my_video.attachvideo(mycamera);//将视频添加到video对象中播放
有时我们为了检测视频的存在,往往通过以下代码进行判断
if(camera.names.length>0){}
备注:camera.names.length 获得当前系统摄像头的个数
2、 抓取图象
1) bitmapdata(width, height, [transparent], [fillcolor])
含义:创建一个具有指定的宽度和高度的 bitmapdata 对象
参数:width 位图图像宽度,以象素点为单位
height 位图图像高度,以象素点为单位
transparent 位图的第个象素点是否支持透明,默认为true.如果为true,则fillcolor值设置为0xaarrggbb(32位argb颜色值)
fillcolor用于填充位图图像区域的 32 位 argb 颜色值
2) bitmapdata .draw(source, [matrix], [colortransform], [blendmode], [cliprect], [smooth])
含义:使用 flash player 矢量呈现器在目标图像上绘制源图像或影片剪辑
参数: source要绘制的 bitmapdata 对象,程序中为捕获的视频源my_video,当然也可以为其它的影片剪辑
matrix 一个 matrix 对象,用于缩放、旋转或转换位图的坐标
colortransform一个 colortransform 对象,用于调整位图的颜色值
blendmode 一个 blendmode 对象
cliprect 一个 rectangle 对象,用于截切
smooth 确定缩放时是否要对 bitmapdata 对象进行平滑处理
3) moveclip.attachbitmap(bmp, depth, [pixelsnapping], [smoothing])
含义:将位图图像附加到影片剪辑
参数:bmp 透明的或不透明的位图图像
depth 一个整数,它指定应该放置位图图像的影艏诘纳疃燃侗?/p>
picelsnapping 像素对齐模式包括 auto、always 和 never.默认模式为 auto
auto: 只要位图没有被拉伸或旋转,它就执行像素对齐
always:始终执行像素对齐,而不管是否拉伸和旋转
nerver:关闭影片剪辑的像素对齐
smoothing:平滑处理模式为 true(表示启用)或 false(表示禁用)。默认模式为禁用
操作:现在我们对刚刚做好的示例再稍做修改
新建一个空影片剪辑,将它从库中拖到场影中,命名为photo,并创建一个按钮,在按钮中添加如下代码:
on (release) { mybitmap = new flash.display.bitmapdata(160, 120); //创建位图对象 mybitmap.draw(my_video); //绘制my_video photo.attachbitmap(mybitmap, 1, "always", true); //添加到photo影片剪加中 } |
效果如下:
3、 建立边框
通过以上的步骤我们已经实现简单的抓图功能了,但是我们会发现在网站中的大头贴除了能拍照外还有很多可供选择的漂亮边框,那么这些又是如何实现的呢?其 实原理还是一样,我们还是通过bitmapdata .draw这个函数,只是对my_video这个video对象做点手术。
操作:我们回到场景中选择my_video,点取菜单中的修改(f8)将my_video转换为影片剪辑。如图
现在我们重新给转换成的影片剪辑命名:video 如图
然后进入video影片剪辑里,新建图2,从库中将前面建立的空影片剪辑拉到场影中,所在位置与my_video相同,并命名为img.我们现在理解一下整个场景中影片剪辑的层次结构。如图
操作:根据结构我们调整一下代码:
将主场景中第一帧中my_video.attachvideo(mycamera);改为video.my_video.attachvideo(mycamera);运行后视频可以正常捕获
将抓取按钮中的mybitmap.draw(my_video);改为mybitmap.draw(video);运行后抓取图像正常
接下来我们就开始完成边框的构建。然后在主场景下建立一个输入文本,并将其命名imgs,然后创建一个按钮,并输入以下代码:
on (release) { video.img.loadmovie(imgs.text); } |
现在我们来测试一下:
测试时只需在边框地址栏处输入相对的路径即可变换边框。这里只是一个简单的换取边框,大家如果有兴趣可以做一个动态的边框系统。
备注:为了方便大家测试,边框下载地址为:http://www.yuso.cn/dtt/frame.rar.4、4、传递颜色参数
1) loadvars
含义:loadvars类可以将对象中所有变量发送到指定的 url 中,并且可以将指定 url 中的所有变量加载到某个对象中
对象的变量表现方式通过“。”实现,例如loadvars.myname=“lanyang”;
2) loadvars.send(url, target, [method])
含义:将 loadvars对象中的变量发送到指定的 url
参数:url 上载变量的目标地址
target 将在其中出现任何响应的浏览器窗口或帧。您可输入特定窗口的名称,或从下面的保留目标名称中选择
_self: 指定当前窗口中的当前帧。
_blank:指定一个新窗口。
_parent:指定当前帧的父级。
_top:指定当前窗口中的顶级帧
method http 协议的 get 或 post 方法。默认值为 post
2) bitmapdata.getpixel(x, y)
含义:它表示特定点 (x, y) 上的 bitmapdata 对象的 rgb 像素值
参数: x 像素x的位置
y 像素y的位置
flash在传递参数值是主要通过bitmapdata创建一个位图,然后获取每个像素点的rgb值,并且存入loadvars对象中,传递给服务器。
操作: 我们继续回到mycamera.fla文件中:
新建一个按钮用于传递变量,并在其中输入代码:
on (release) { var my_lv:loadvars = new loadvars();//创建loadvars对象 my_lv.pix="";//存储颜色值 my_lv.w=160;//存储宽度 my_lv.h=120;//存储高度 mybitmap = new flash.display.bitmapdata(160,120); //创建bitmapdata对象 mybitmap.draw(photo); //绘制photo for(j=0;j<120;j++) //获得每个象素点rgb值 { for(i=0;i<160;i++) { m=i*j; temp=mybitmap.getpixel(i, j).tostring(16); //转换成16进制 my_lv.pix+=temp+","; } } my_lv.send("showpic.asp", "_blank", "post"); } |
最后界面如下图;
二、 asp.net部分
这一部分主要针对asp.net的朋友,如果你对asp.net不感兴趣,可以直接跳过阅读下面的asp部分。
原理:通过bitmap类根据接收过来的颜色值重新绘制成图片
1)bitmap.setpixel(int x, int y, color color)
含义:设置bitmap中指定象素点的颜色
命名空间:system.drawing
参数: x 要设置的像素的 x 坐标。
y 要设置的像素的 y 坐标。
color color 结构,它表示要分配给指定像素的颜色
2) color.fromargb(int argb)
含义:从一个 32 位 argb 值创建 color 结构。
命名空间:system.drawing
参数:argb 指定 32 位 argb 值的值。
3) convert.toint32(string value, int32 frombase)
含义:进制转换
命名空间:system
参数:value 包含数字的 string.
frombase value 中数字的基数,它必须是 2、8、10 或 16.如果为16则value前可以加上"0x"或"0x"
备注:实现进制转换,value为包含数字的字符串,后面则为进制类型
4) bitmap.save (string filename, imageformat format)
含义:将此bitmap以指定格式保存到指定文件。
命名空间:system.drawing
参数:filename 保存文件的文件名
format 图像的图像格式,这里采用jpeg(imageformat.jpeg)
根据以上各类方法的定义,我们采用setpixel设定bitmap每象素点的颜色值,然后通过sava存为图片。下面请看代码:
建立showpic.aspx,在其cs文件中添加如下代码:
using system.drawing; using system.drawing.imaging; public partial class showpic : system.web.ui.page { protected void page_load(object sender, eventargs e) { int w = convert.toint32(request["w"]); //获得宽度 int h = convert.toint32(request["h"]); //获得高度 bitmap mybitmap = new bitmap(w,h); string cs = request["pix"]; //获得颜色值 string[] c = cs.split(','); for (int ycount = 0; ycount <h; ycount++) { for (int xcount = 0; xcount < w; xcount++) { mybitmap.setpixel(xcount,ycount,color.fromargb(convert.toint32("0x00"+c[ycount *w + xcount],16))); //设置象素点颜色 } } mybitmap.save(server.mappath("s.jpg"), imageformat.jpeg); //保存图片 response.write("<img src='s.jpg'>"); //显示图片 } } |
这样我们就可以将图片保存在服务器当前目录下,并且通过<img src=“……”>进行调用。
三、 asp部分
asp生成图片相对于asp.net比较复杂一点,由于没有现成的类或者函数调用,因此我们不得不先对bmp位图的结构作一个简单的介绍。以下bmp位图结构介绍来源于网络。
bmp位图由文件头、位图信息头、颜色信息和图形数据四部分组成。
1.文件头信息块0000-0001:文件标识,为字母ascii码“bm”。
0002-0005:文件大小。
0006-0009:保留,每字节以“00”填写。
000a-000d:记录图像数据区的起始位置。各字节的信息依次含义为:文件头信息块大小,图像描述信息块的大小,图像颜色表的大小,保留(为01)。
2.图像描述信息块000e-0011:图像描述信息块的大小,常为28h. 0012-0015:图像宽度。
0016-0019:图像高度。
001a-001b:图像的plane总数(恒为1)。
001c-001d:记录像素的位数,很重要的数值,图像的颜色数由该值决定。
001e-0021:数据压缩方式(数值位0:不压缩;1:8位压缩;2:4位压缩)。
0022-0025:图像区数据的大小。
0026-0029:水平每米有多少像素,在设备无关位图(。dib)中,每字节以00h填写。
002a-002d:垂直每米有多少像素,在设备无关位图(。dib)中,每字节以00h填写。
002e-0031:此图像所用的颜色数,如值为0,表示所有颜色一样重要。
3.颜色表
颜色表的大小根据所使用的颜色模式而定:2色图像为8字节;16色图像位64字节;256色图像为1024字节。其中,每4字节表示一种颜色,并以b (蓝色)、g(绿色)、r(红色)、alpha(32位位图的透明度值,一般不需要)。即首先4字节表示颜色号0的颜色,接下来表示颜色号1的颜色,依此 类推。
4.图像数据区颜色表
接下来位为位图文件的图像数据区,在此部分记录着 每 点像素对应的颜色号,其记录方式也随颜色模式而定,既2色图像每点占1位(8位为1字节);16色图像每点占4位(半字节);256色图像每点占8位(1 字节);真彩色图像每点占24位(3字节)。所以,整个数据区的大小也会随之变化。究其规律而言,可的出如下计算公式:图像数据信息大小=(图像宽度*图 像高度*记录像素的位数)/8.然而,未压缩的图像信息区的大小。除了真彩色模式外,其余的均大于或等于数据信息的大小。这是为什么呢?原因有两个: 1.bmp文件记录一行图像是以字节为单位的。因此,就不存在一个字节中的数据位信息表示的点在不同的两行中。也就是说,设显示模式位16色,在每个字节 分配两个点信息时,如果图像的宽度位奇数,那么最后一个像素点的信息将独占一个字节,这个字节的后4位将没有意义。接下来的一个字节将开始记录下一行的信 息。
2.为了显示的方便,除了真彩色外,其他的每中颜色模式的行字节数要用数据“00”补齐为4的整数倍。如果显示模式为16色,当 图 像宽为19时,存储时每行则要补充4-(19/2+1)%4=2个字节(加1是因为里面有一个像素点要独占了一字节)。如果显示模式为256色,当图像宽 为19时,每行也要补充4-19%4=1个字节。
还有一点我要申明,当屏幕初始化为16或256色模式时,一定要设置调色板或修正颜色值,否则无法得到正确的图像颜色。
源码如下:
<%
w=request("w") '获得图像宽度
h=request("h") '获得图像高度
pix=request("pix") '获得颜色值
cs=split(pix,",")
function to3(nums) '将接收的16进制rgb格式转换并添加到图象数据区
dim myarray()
dim iii, tmp
for iii=1 to 3
tmp=mid(nums,iii*2-1,2)
redim preserve myarray(iii)
myarray(iii) =chn10(tmp)
next
to3 = chrb(myarray(3))&chrb(myarray(2))&chrb(myarray(1))
end function
function chn10(nums) '将16进制转换为10进制
dim tmp, tmpstr, intloop4
nums_len=len(nums)
for intloop4=1 to nums_len
tmp=mid(nums,intloop4,1)
if isnumeric(tmp) then
tmp=tmp * 16 * (16^(nums_len-intloop4-1))
else
tmp=(asc(ucase(tmp))-55) * (16^(nums_len-intloop4))
end if
tmpstr=tmpstr+tmp
next
chn10 = tmpstr
end function
response.expires = -9999
response.addheader "cache-control","no-cache"
'文件头开始
strheaddata=chrb(66) & chrb(77) '文件标识
strheaddata=strheaddata&chrb(230) & chrb(4) & chrb(0) & chrb(0) '文件大小
strheaddata=strheaddata & chrb(0) & chrb(0) & chrb(0) & chrb(0) '保留,每字节以“00”填写
strheaddata=strheaddata&chrb(54) & chrb(0) & chrb(0) & chrb(0) '记录图像数据区的起始位置
strheaddata=strheaddata & chrb(40) & chrb(0) &chrb(0) & chrb(0) '图像描述信息块的大小
strheaddata =strheaddata &chrb(w) & chrb(0) & chrb(0) & chrb(0) '宽度
strheaddata =strheaddata & chrb(h) & chrb(0) & chrb(0) & chrb(0) '高度
strheaddata =strheaddata & chrb(1) & chrb(0) '图像的plane总数
strheaddata =strheaddata &chrb(24) & chrb(0) '图像的位数
strheaddata =strheaddata & chrb(0) & chrb(0) & chrb(0) & chrb(0) '数据压缩方式
strheaddata =strheaddata &chrb(176) & chrb(4) & chrb(0) & chrb(0) '图像区数据的大小
strheaddata =strheaddata & chrb(18) & chrb(11) & chrb(0) & chrb(0) '水平每米有多少像素
strheaddata =strheaddata & chrb(0) & chrb(0) &chrb(0) & chrb(0) '垂直每米有多少像素
strheaddata =strheaddata & chrb(0) & chrb(0) & chrb(0) & chrb(0) '此图像所用的颜色数
strheaddata =strheaddata & chrb(0) & chrb(0) & chrb(0) & chrb(0) '颜色表
'文件头结束
strmaindata="" '数据区
for k=h-1 to 0 step -1
for j=0 to w-1
strmaindata=strmaindata&to3(cs(k*w+j))
next
next
strsavedata=strheaddata+strmaindata
set jpeg = server.createobject("persits.jpeg")
jpeg.openbinary strsavedata
jpeg.width = jpeg.originalwidth
jpeg.height = jpeg.originalheight
jpeg.save server.mappath("aspimg.jpg") ' 保存缩略图到指定文件夹下
set jpeg = nothing ' 注销实例
response.write("<img src='aspimg.jpg'>")
%>
/////////////////////////////////////////////////////////////////////////////////////////////////
<%
if Request.QueryString("query")<>"test"
Then
%>
<form action="?query=test" method="post"
enctype="multipart/form-data" name="form1" id="form1">
<input
type="file" name="file" />
<input type="submit" name="submit"
value="提交" />
</form>
<%
Else
Response.ContentType="image/gif"'设置输出类型为图像
data=Request.BinaryRead(Request.TotalBytes)'获取客户端传送的所有数据
tcrlf=ChrB(13)
&
ChrB(10)'回车符号代码
flag=LeftB(data,InstrB(data,tcrlf)-1)'获取图像数据结束标志
datastart=InstrB(data,tcrlf
&
tcrlf)+4'获取图像数据开始位置
datalength=InstrB(datastart+1,data,flag)-datastart'获取图像数据长度
Response.BinaryWrite
MidB(data,datastart,datalength)'输出图像
End If
%>
相关推荐
php+flash 异步上传图片插件生成缩略图,经过测试很好的插件工具
FLASH+PHP上传,返回值到当前页面,可以自定义传送值到PHP上传处理的页面,这样就可以定义接受图片文件夹。update.php逻辑处理,file_upload.php上传类,可定义源文件名或者随机命名和缩略图大小. 没分了,来赚点...
PHP+Flash头像图片上传并裁切 图片剪切、指定区域图片生成
本资源用于把程序生成的位图保存到本地,保存的格式是png格式,其中包括fla文件,swc库,生成png的类,以及一段简单的特效代码,今天心情大好,分享出来大家一块用!哈哈哈... 之后还会陆续上传!
java版头像上传,可以对头像进行裁剪,生成所选区的图片
PHP+Flash头像图片上传并裁切 图片剪切、指定区域图片生成
asp+flash+jquery 图片批量上传 图集上传
从ueditor中把批量上传图片的flash分离出来,同时实现生成缩略图
通过flash实现图像的上传,在上传之前可以对图片进行旋转、剪切、等操作。
boddy文件夹:存放图片的文件 file_upload.php:上传图片和生成缩略图的类 update.php:执行文件,生成的新文件名在这个文件获取 ...目前可以多文件上传,生成缩略图,并可以获取重命名的图片名称,可以插入数据库
.NET2.0 图片上传 Flash上传 + 图片裁剪生成缩略图
thinkphp+ajax图片上传,可以上传多张图片,可以生成缩略图,避免了有些浏览器不支持flash插件,改代码完美解决批量上传图片的问题,代码已经调试,可以直接使用。
queueSizeLimit : 当允许多文件生成时,设置选择文件的个数,默认值:999 。 multi : 设置为true时可以上传多个文件。 auto : 设置为true当选择文件后就直接上传了,为false需要点击上传按钮才上传 。 ...
上传图片可用鼠标拖动自由裁切图片,生成头像 附有源码!
剥离UCenter的Flash头像上传程序为独立的程序,经过初步测试有效。其中的swf文件来源自Discuz程序。可指定任意的头像上传入口(即uc_api + 当前执行脚本文件名)。并做了优化处理可以,只要两个文件即可完成功能。更...
如果对百度开源API Tangram baidu.flash.avatarMaker的 uploadURL:getfileAvatar.php不知如何下手,不知道如何获取图片,生成图片。那么喜爱.net开发的你算是找对资源啦。
因为Uploadify是用flash做的,所以如果浏览器上面看不到"上传"按钮,请先检查你的flash是否已安装。 压缩包里包含两个项目,一个是多图上传的示例(不含数据库),另一个也是多图上传的示例,不过这个可以修改每张...
参考molaifeng的一篇文章,解决了因flash版本升级而导致FaustCplus生成不了预览图片的问题,但是点保存按钮后,得不到返回值,导致图片保存成功后,Flash框不自动关闭。 后来看到gukie的一个方法,按他的修正,解决...
PHP/Asp/Asp.Net+Flash多文件上传,分别有列表模式和缩略图模式上传,可以自定义传送值到PHP上传处理的页面,update.php上传类,可随机生成文件名和相对应的缩略图,
3.主图片模块栏目加入批量上传功能,同时支持批量生成缩略图。 4.后台内容编辑器采用Fckeditor编辑器,并且加入内容附件上传功能。 5.多风格配置设置,网站预置风格可选择设置。 6.网站后台加入IP归属地查询、...