`
xingxuan818
  • 浏览: 23374 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

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
%>

分享到:
评论
1 楼 keete 2011-03-18  
要是有源码就赞了。

相关推荐

    ASP+flash图片批量上传系统和一般的图片上传系统一样,都需要服务器组件的支持

    ASP+Flash图片批量上传系统是一种基于Active Server Pages (ASP)技术与Adobe Flash技术结合的图片上传解决方案。在互联网应用中,图片上传功能是常见的需求,尤其是对于内容管理系统、电子商务平台等,用户可能需要...

    php+flash 异步上传图片插件生成缩略图

    本话题聚焦于使用PHP和Flash技术实现异步图片上传,并生成缩略图的功能。这种技术组合允许用户在不刷新整个页面的情况下,将图片上传至服务器,提升用户体验。 首先,`PHP`是一种广泛使用的开源脚本语言,特别适合...

    ASP.NET利用FLASH批量上传图片

    在ASP.NET中实现Flash批量上传图片的功能,主要是结合了Flash的技术来处理大文件和多文件的上传需求,因为Flash在处理大文件上传时能够分块上传,避免了一次性加载整个文件对服务器造成的压力。以下是关于这个主题的...

    优化kindeditor,修改flash批量上传图片方式为H5上传

    对于上传本地视频,处理方式类似图片上传,只不过需要考虑视频文件的格式和大小限制。 “添加手机尺寸预览”意味着在编辑器中,用户可以看到内容在不同移动设备屏幕尺寸下的效果。这可能通过CSS媒体查询实现,根据...

    PHP+FLASH批量上传图片并生成缩略图

    FLASH+PHP上传,返回值到当前页面,可以自定义传送值到PHP上传处理的页面,这样就可以定义接受图片文件夹。update.php逻辑处理,file_upload.php上传类,可定义源文件名或者随机命名和缩略图大小. 没分了,来赚点...

    ASP.NET+Flash多图片批量上传工具

    3. **预览功能**:在用户选择图片后,Flash可以读取文件内容并生成缩略图,实现在上传前的预览。这有助于用户确认他们选择的图片是否正确,同时也可以提供基本的质量检查。 4. **文件上传**:当用户确认图片后,...

    kindeditor--自定义添加网络视频插件,修改批量图片上传方式flash为h5

    其次,修改批量图片上传方式从Flash转为H5。由于Flash技术逐渐被淘汰,HTML5提供了更好的跨平台支持,尤其是移动设备。在KindEditor中,可以使用HTML5的File API来实现图片的拖放和选择上传。你需要做以下工作: 1....

    PHP+Flash头像图片上传并裁切

    在本文中,我们将深入探讨如何使用PHP和Flash技术来实现一个功能完善的头像图片上传及裁切系统。这个系统的特点是允许用户无刷新地上传图片,并通过拖动操作进行自由裁切,最后保存裁切后的图像。以下是实现这一功能...

    优化kindeditor,修改flash批量上传图片方式为H5上传,添加第三方视频代码功能,添加手机尺寸预览,粘

    1. **Flash批量上传图片向H5上传的转变**: 随着Flash技术的逐渐淘汰,将KindEditor中原有的基于Flash的图片批量上传方式替换为H5(HTML5)上传,这是一个必要的优化步骤。HTML5引入了File API,使得在浏览器中处理...

    asp+flash图片上传

    "asp+flash图片上传"是指使用ASP作为后端处理和Flash作为前端交互的方式,实现用户在网页上选择图片并上传的功能。这种技术在早期的网页设计中非常流行,因为它能够提供良好的用户体验,比如预览上传的图片、进度条...

    flash 多文件上传 源文件

    6. **files**:这个可能是上传的文件存储目录或者是一个示例文件夹,用于存放用户上传的图片文件。在实际应用中,服务器需要一个特定的目录来接收和管理上传的文件,通常会进行一定的命名规则和存储策略以保证文件...

    图片上传jquery+flash

    在本案例中,我们关注的是一个使用jQuery和Flash实现的图片上传解决方案,它提供了图片预览(缩略图)、添加水印以及进度条显示的功能。下面我们将详细探讨这些知识点。 首先,jQuery是一个广泛使用的JavaScript库...

    flash上传图片,支持视频截图,缩略图查看

    Flash可以生成图片的缩略图,这样在页面加载大量图片时,可以先加载较小的缩略图,提高页面的加载速度,同时减少用户等待时间。用户点击缩略图后,再加载原图,提升用户体验。在实现这一功能时,Flash提供了强大的...

    asp+flash 切图上传 头像上传 图片可视截取上传

    在本场景中,我们关注的是一个使用ASP(Active Server Pages)技术和Flash技术实现的图片上传解决方案,它允许用户进行可视化的裁剪和预览,确保上传的图片符合特定的尺寸要求,通常用于创建个人头像等应用。...

    jsp头像上传仿flash效果

    【标签】"JAVA jsp flash 头像 图片上传"进一步明确了这个项目的关键技术。首先,它基于JAVA和JSP,这是一种使用Java语言编写的服务器端脚本技术,用于生成动态网页。"flash"指的是仿效Flash的效果。"头像"表明这是...

    图片上传 图像flash现实 图片滚动现实 asp.net实例

    在ASP.NET开发中,图片上传、Flash显示图像以及图片滚动展示是常见的功能需求,这些功能在网站设计中尤其重要,可以提升用户体验并增加网站的互动性。本实例将详细讲解如何在ASP.NET环境下实现这些功能。 首先,...

    php+flash头像上传组件

    在头像上传场景中,Flash提供了友好的用户界面,允许用户选择本地计算机上的图片文件。Flash可以与服务器进行XMLSocket或HTTP通信,将选择的文件以Base64编码发送到服务器。需要注意的是,由于现代浏览器对Flash的...

    Flash上传头像并裁剪 + PHP后台

    1. AS源码:ActionScript代码,这是Flash编程使用的语言,用于实现用户界面交互和图片上传裁剪功能。 2. PHP脚本:处理图片上传和裁剪的后端代码,可能包括接收上传数据、保存文件、裁剪图片等功能。 3. 图片示例或...

    flash+asp批量上传文件

    在IT行业中,批量上传文件是一项常见的需求,尤其在图片管理、文档共享等场景下。"Flash+ASP批量上传文件"的实现方式就是一种经典的技术解决方案,它结合了Adobe Flash技术与Active Server Pages (ASP)脚本语言,为...

Global site tag (gtag.js) - Google Analytics