日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

flash 生成图片上传

發(fā)布時(shí)間:2024/3/26 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 flash 生成图片上传 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先我們通過flash中的camera對(duì)象通過攝像頭捕抓圖像,存入變量中,然后傳遞給服務(wù)器端(asp.net或asp),服務(wù)器端再通過一定的算法對(duì)圖像每個(gè)象素點(diǎn)進(jìn)行顏色設(shè)置,最終還原出flash抓取的圖片。

  一、 flash部分

  1、? 捕獲視頻

  1)? cmaera.get()? 返回對(duì)用于捕獲視頻的 camera 對(duì)象的引用。若要實(shí)際開始捕獲視頻,必須將 camera 對(duì)象附加到 video 對(duì)象

  2)? video.attachvideo(source)? 指定將在舞臺(tái)上的 video 對(duì)象的邊界內(nèi)顯示的視頻流

  參數(shù)source: 正在捕獲視頻數(shù)據(jù)的 camera 對(duì)象,或 netstream 對(duì)象。要切斷與該 video 對(duì)象的連接,請(qǐng)為 source 傳遞 null.

  操作:根據(jù)以上兩點(diǎn),我們先來看一個(gè)示例:

  新建一個(gè)新文件mycmaera.fla,在庫中右擊新建視頻,按下圖設(shè)置

  從庫中將my_video拖入到場景中,設(shè)置其屬性名為my_video,在場景第一幀輸入以下代碼:

  mycamera=camera.get();//捕獲系統(tǒng)攝像頭視頻

  my_video.attachvideo(mycamera);//將視頻添加到video對(duì)象中播放

  有時(shí)我們?yōu)榱藱z測視頻的存在,往往通過以下代碼進(jìn)行判斷

  if(camera.names.length>0){}

  備注:camera.names.length? 獲得當(dāng)前系統(tǒng)攝像頭的個(gè)數(shù)

2、? 抓取圖象

  1)?? bitmapdata(width, height, [transparent], [fillcolor])

  含義:創(chuàng)建一個(gè)具有指定的寬度和高度的 bitmapdata 對(duì)象

  參數(shù):width 位圖圖像寬度,以象素點(diǎn)為單位

  height 位圖圖像高度,以象素點(diǎn)為單位

  transparent 位圖的第個(gè)象素點(diǎn)是否支持透明,默認(rèn)為true.如果為true,則fillcolor值設(shè)置為0xaarrggbb(32位argb顏色值)

  fillcolor用于填充位圖圖像區(qū)域的 32 位 argb 顏色值

  2)? bitmapdata .draw(source, [matrix], [colortransform], [blendmode], [cliprect], [smooth])

  含義:使用 flash player 矢量呈現(xiàn)器在目標(biāo)圖像上繪制源圖像或影片剪輯

  參數(shù): source要繪制的 bitmapdata 對(duì)象,程序中為捕獲的視頻源my_video,當(dāng)然也可以為其它的影片剪輯

  matrix? 一個(gè) matrix 對(duì)象,用于縮放、旋轉(zhuǎn)或轉(zhuǎn)換位圖的坐標(biāo)

  colortransform一個(gè) colortransform 對(duì)象,用于調(diào)整位圖的顏色值

  blendmode? 一個(gè) blendmode 對(duì)象

  cliprect? 一個(gè) rectangle 對(duì)象,用于截切

  smooth? 確定縮放時(shí)是否要對(duì) bitmapdata 對(duì)象進(jìn)行平滑處理

  3)???? moveclip.attachbitmap(bmp, depth, [pixelsnapping], [smoothing])

  含義:將位圖圖像附加到影片剪輯

  參數(shù):bmp? 透明的或不透明的位圖圖像

  depth? 一個(gè)整數(shù),它指定應(yīng)該放置位圖圖像的影艏詰納疃燃侗?/p>

  picelsnapping 像素對(duì)齊模式包括 auto、always 和 never.默認(rèn)模式為 auto

  auto: 只要位圖沒有被拉伸或旋轉(zhuǎn),它就執(zhí)行像素對(duì)齊

  always:始終執(zhí)行像素對(duì)齊,而不管是否拉伸和旋轉(zhuǎn)

  nerver:關(guān)閉影片剪輯的像素對(duì)齊

  smoothing:平滑處理模式為 true(表示啟用)或 false(表示禁用)。默認(rèn)模式為禁用

  操作:現(xiàn)在我們對(duì)剛剛做好的示例再稍做修改

  新建一個(gè)空影片剪輯,將它從庫中拖到場影中,命名為photo,并創(chuàng)建一個(gè)按鈕,在按鈕中添加如下代碼:

?

on (release) {
mybitmap = new flash.display.bitmapdata(160, 120); //創(chuàng)建位圖對(duì)象
mybitmap.draw(my_video); //繪制my_video
photo.attachbitmap(mybitmap, 1, "always", true); //添加到photo影片剪加中
}

  效果如下:

  3、? 建立邊框

   通過以上的步驟我們已經(jīng)實(shí)現(xiàn)簡單的抓圖功能了,但是我們會(huì)發(fā)現(xiàn)在網(wǎng)站中的大頭貼除了能拍照外還有很多可供選擇的漂亮邊框,那么這些又是如何實(shí)現(xiàn)的呢?其 實(shí)原理還是一樣,我們還是通過bitmapdata .draw這個(gè)函數(shù),只是對(duì)my_video這個(gè)video對(duì)象做點(diǎn)手術(shù)。

  操作:我們回到場景中選擇my_video,點(diǎn)取菜單中的修改(f8)將my_video轉(zhuǎn)換為影片剪輯。如圖

  現(xiàn)在我們重新給轉(zhuǎn)換成的影片剪輯命名:video 如圖

  然后進(jìn)入video影片剪輯里,新建圖2,從庫中將前面建立的空影片剪輯拉到場影中,所在位置與my_video相同,并命名為img.我們現(xiàn)在理解一下整個(gè)場景中影片剪輯的層次結(jié)構(gòu)。如圖

  操作:根據(jù)結(jié)構(gòu)我們調(diào)整一下代碼:

  將主場景中第一幀中my_video.attachvideo(mycamera);改為video.my_video.attachvideo(mycamera);運(yùn)行后視頻可以正常捕獲

  將抓取按鈕中的mybitmap.draw(my_video);改為mybitmap.draw(video);運(yùn)行后抓取圖像正常

  接下來我們就開始完成邊框的構(gòu)建。然后在主場景下建立一個(gè)輸入文本,并將其命名imgs,然后創(chuàng)建一個(gè)按鈕,并輸入以下代碼:

?

on (release) {
video.img.loadmovie(imgs.text);
}

  現(xiàn)在我們來測試一下:

測試時(shí)只需在邊框地址欄處輸入相對(duì)的路徑即可變換邊框。這里只是一個(gè)簡單的換取邊框,大家如果有興趣可以做一個(gè)動(dòng)態(tài)的邊框系統(tǒng)。

  備注:為了方便大家測試,邊框下載地址為:http://www.yuso.cn/dtt/frame.rar.4、4、傳遞顏色參數(shù)

  1)? loadvars

  含義:loadvars類可以將對(duì)象中所有變量發(fā)送到指定的 url 中,并且可以將指定 url 中的所有變量加載到某個(gè)對(duì)象中

  對(duì)象的變量表現(xiàn)方式通過“。”實(shí)現(xiàn),例如loadvars.myname=“l(fā)anyang”;

  2) loadvars.send(url, target, [method])

  含義:將 loadvars對(duì)象中的變量發(fā)送到指定的 url

  參數(shù):url? 上載變量的目標(biāo)地址

  target? 將在其中出現(xiàn)任何響應(yīng)的瀏覽器窗口或幀。您可輸入特定窗口的名稱,或從下面的保留目標(biāo)名稱中選擇

  _self: 指定當(dāng)前窗口中的當(dāng)前幀。

  _blank:指定一個(gè)新窗口。

  _parent:指定當(dāng)前幀的父級(jí)。

  _top:指定當(dāng)前窗口中的頂級(jí)幀

  method? http 協(xié)議的 get 或 post 方法。默認(rèn)值為 post

  2)? bitmapdata.getpixel(x, y)

  含義:它表示特定點(diǎn) (x, y) 上的 bitmapdata 對(duì)象的 rgb 像素值

  參數(shù): x? 像素x的位置

  y? 像素y的位置

  flash在傳遞參數(shù)值是主要通過bitmapdata創(chuàng)建一個(gè)位圖,然后獲取每個(gè)像素點(diǎn)的rgb值,并且存入loadvars對(duì)象中,傳遞給服務(wù)器。

  操作: 我們繼續(xù)回到mycamera.fla文件中:

  新建一個(gè)按鈕用于傳遞變量,并在其中輸入代碼:

?

on (release) {
var my_lv:loadvars = new loadvars();//創(chuàng)建loadvars對(duì)象
my_lv.pix="";//存儲(chǔ)顏色值
my_lv.w=160;//存儲(chǔ)寬度
my_lv.h=120;//存儲(chǔ)高度
mybitmap = new flash.display.bitmapdata(160,120); //創(chuàng)建bitmapdata對(duì)象
mybitmap.draw(photo); //繪制photo
for(j=0;j<120;j++) //獲得每個(gè)象素點(diǎn)rgb值
{
for(i=0;i<160;i++)
{
m=i*j;
temp=mybitmap.getpixel(i, j).tostring(16); //轉(zhuǎn)換成16進(jìn)制
my_lv.pix+=temp+",";
}
}
my_lv.send("showpic.asp", "_blank", "post");
}

  最后界面如下圖;

二、 asp.net部分

  這一部分主要針對(duì)asp.net的朋友,如果你對(duì)asp.net不感興趣,可以直接跳過閱讀下面的asp部分。

  原理:通過bitmap類根據(jù)接收過來的顏色值重新繪制成圖片

  1)bitmap.setpixel(int x, int y, color color)

  含義:設(shè)置bitmap中指定象素點(diǎn)的顏色

  命名空間:system.drawing

  參數(shù): x? 要設(shè)置的像素的 x 坐標(biāo)。

  y 要設(shè)置的像素的 y 坐標(biāo)。

  color? color 結(jié)構(gòu),它表示要分配給指定像素的顏色

  2)????? color.fromargb(int argb)

  含義:從一個(gè) 32 位 argb 值創(chuàng)建 color 結(jié)構(gòu)。

  命名空間:system.drawing

  參數(shù):argb 指定 32 位 argb 值的值。

  3)????? convert.toint32(string value, int32 frombase)

  含義:進(jìn)制轉(zhuǎn)換

  命名空間:system

  參數(shù):value? 包含數(shù)字的 string.

  frombase? value 中數(shù)字的基數(shù),它必須是 2、8、10 或 16.如果為16則value前可以加上"0x"或"0x"

  備注:實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換,value為包含數(shù)字的字符串,后面則為進(jìn)制類型

  4)????? bitmap.save (string filename, imageformat format)

  含義:將此bitmap以指定格式保存到指定文件。

  命名空間:system.drawing

  參數(shù):filename 保存文件的文件名

  format? 圖像的圖像格式,這里采用jpeg(imageformat.jpeg)

  根據(jù)以上各類方法的定義,我們采用setpixel設(shè)定bitmap每象素點(diǎn)的顏色值,然后通過sava存為圖片。下面請(qǐng)看代碼:

  建立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))); //設(shè)置象素點(diǎn)顏色
}
}
mybitmap.save(server.mappath("s.jpg"), imageformat.jpeg); //保存圖片
response.write("<img src='s.jpg'>"); //顯示圖片
}
}

  這樣我們就可以將圖片保存在服務(wù)器當(dāng)前目錄下,并且通過<img src=“……”>進(jìn)行調(diào)用。

  三、? asp部分

  asp生成圖片相對(duì)于asp.net比較復(fù)雜一點(diǎn),由于沒有現(xiàn)成的類或者函數(shù)調(diào)用,因此我們不得不先對(duì)bmp位圖的結(jié)構(gòu)作一個(gè)簡單的介紹。以下bmp位圖結(jié)構(gòu)介紹來源于網(wǎng)絡(luò)。

  bmp位圖由文件頭、位圖信息頭、顏色信息和圖形數(shù)據(jù)四部分組成。

  1.文件頭信息塊0000-0001:文件標(biāo)識(shí),為字母ascii碼“bm”。

  0002-0005:文件大小。

  0006-0009:保留,每字節(jié)以“00”填寫。

  000a-000d:記錄圖像數(shù)據(jù)區(qū)的起始位置。各字節(jié)的信息依次含義為:文件頭信息塊大小,圖像描述信息塊的大小,圖像顏色表的大小,保留(為01)。

  2.圖像描述信息塊000e-0011:圖像描述信息塊的大小,常為28h. 0012-0015:圖像寬度。

  0016-0019:圖像高度。

  001a-001b:圖像的plane總數(shù)(恒為1)。

  001c-001d:記錄像素的位數(shù),很重要的數(shù)值,圖像的顏色數(shù)由該值決定。

  001e-0021:數(shù)據(jù)壓縮方式(數(shù)值位0:不壓縮;1:8位壓縮;2:4位壓縮)。

  0022-0025:圖像區(qū)數(shù)據(jù)的大小。

  0026-0029:水平每米有多少像素,在設(shè)備無關(guān)位圖(。dib)中,每字節(jié)以00h填寫。

  002a-002d:垂直每米有多少像素,在設(shè)備無關(guān)位圖(。dib)中,每字節(jié)以00h填寫。

  002e-0031:此圖像所用的顏色數(shù),如值為0,表示所有顏色一樣重要。

3.顏色表

   顏色表的大小根據(jù)所使用的顏色模式而定:2色圖像為8字節(jié);16色圖像位64字節(jié);256色圖像為1024字節(jié)。其中,每4字節(jié)表示一種顏色,并以b (藍(lán)色)、g(綠色)、r(紅色)、alpha(32位位圖的透明度值,一般不需要)。即首先4字節(jié)表示顏色號(hào)0的顏色,接下來表示顏色號(hào)1的顏色,依此 類推。

  4.圖像數(shù)據(jù)區(qū)顏色表

  接下來位為位圖文件的圖像數(shù)據(jù)區(qū),在此部分記錄著 每 點(diǎn)像素對(duì)應(yīng)的顏色號(hào),其記錄方式也隨顏色模式而定,既2色圖像每點(diǎn)占1位(8位為1字節(jié));16色圖像每點(diǎn)占4位(半字節(jié));256色圖像每點(diǎn)占8位(1 字節(jié));真彩色圖像每點(diǎn)占24位(3字節(jié))。所以,整個(gè)數(shù)據(jù)區(qū)的大小也會(huì)隨之變化。究其規(guī)律而言,可的出如下計(jì)算公式:圖像數(shù)據(jù)信息大小=(圖像寬度*圖 像高度*記錄像素的位數(shù))/8.然而,未壓縮的圖像信息區(qū)的大小。除了真彩色模式外,其余的均大于或等于數(shù)據(jù)信息的大小。這是為什么呢?原因有兩個(gè): 1.bmp文件記錄一行圖像是以字節(jié)為單位的。因此,就不存在一個(gè)字節(jié)中的數(shù)據(jù)位信息表示的點(diǎn)在不同的兩行中。也就是說,設(shè)顯示模式位16色,在每個(gè)字節(jié) 分配兩個(gè)點(diǎn)信息時(shí),如果圖像的寬度位奇數(shù),那么最后一個(gè)像素點(diǎn)的信息將獨(dú)占一個(gè)字節(jié),這個(gè)字節(jié)的后4位將沒有意義。接下來的一個(gè)字節(jié)將開始記錄下一行的信 息。

  2.為了顯示的方便,除了真彩色外,其他的每中顏色模式的行字節(jié)數(shù)要用數(shù)據(jù)“00”補(bǔ)齊為4的整數(shù)倍。如果顯示模式為16色,當(dāng) 圖 像寬為19時(shí),存儲(chǔ)時(shí)每行則要補(bǔ)充4-(19/2+1)%4=2個(gè)字節(jié)(加1是因?yàn)槔锩嬗幸粋€(gè)像素點(diǎn)要獨(dú)占了一字節(jié))。如果顯示模式為256色,當(dāng)圖像寬 為19時(shí),每行也要補(bǔ)充4-19%4=1個(gè)字節(jié)。

  還有一點(diǎn)我要申明,當(dāng)屏幕初始化為16或256色模式時(shí),一定要設(shè)置調(diào)色板或修正顏色值,否則無法得到正確的圖像顏色。

  源碼如下:

<%
w=request("w") '獲得圖像寬度
h=request("h") '獲得圖像高度
pix=request("pix") '獲得顏色值
cs=split(pix,",")
function to3(nums) '將接收的16進(jìn)制rgb格式轉(zhuǎn)換并添加到圖象數(shù)據(jù)區(qū)
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進(jìn)制轉(zhuǎn)換為10進(jìn)制
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) '文件標(biāo)識(shí)
strheaddata=strheaddata&chrb(230) & chrb(4) & chrb(0) & chrb(0) '文件大小
strheaddata=strheaddata & chrb(0) & chrb(0) & chrb(0) & chrb(0) '保留,每字節(jié)以“00”填寫
strheaddata=strheaddata&chrb(54) & chrb(0) & chrb(0) & chrb(0) '記錄圖像數(shù)據(jù)區(qū)的起始位置
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總數(shù)
strheaddata =strheaddata &chrb(24) & chrb(0) '圖像的位數(shù)
strheaddata =strheaddata & chrb(0) & chrb(0) & chrb(0) & chrb(0) '數(shù)據(jù)壓縮方式
strheaddata =strheaddata &chrb(176) & chrb(4) & chrb(0) & chrb(0) '圖像區(qū)數(shù)據(jù)的大小
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) '此圖像所用的顏色數(shù)
strheaddata =strheaddata & chrb(0) & chrb(0) & chrb(0) & chrb(0) '顏色表
'文件頭結(jié)束
strmaindata="" '數(shù)據(jù)區(qū)
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 ' 注銷實(shí)例
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"'設(shè)置輸出類型為圖像
data=Request.BinaryRead(Request.TotalBytes)'獲取客戶端傳送的所有數(shù)據(jù)
tcrlf=ChrB(13) & ChrB(10)'回車符號(hào)代碼
flag=LeftB(data,InstrB(data,tcrlf)-1)'獲取圖像數(shù)據(jù)結(jié)束標(biāo)志
datastart=InstrB(data,tcrlf & tcrlf)+4'獲取圖像數(shù)據(jù)開始位置
datalength=InstrB(datastart+1,data,flag)-datastart'獲取圖像數(shù)據(jù)長度
Response.BinaryWrite MidB(data,datastart,datalength)'輸出圖像
End If
%>

總結(jié)

以上是生活随笔為你收集整理的flash 生成图片上传的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。