2011年5月19日
将Flex中的信息通过Socket,由Java来接受并进行处理可以大大的降低Flex的前台的处理,这是我最近一周来做的事,被这些小事给缠住了,可这些小问题又不得不解决,对于我这个初学者来说还是比较辛苦的,当然对于牛人来说这就是小儿科了,就当看笑话吧,对于新手或有这方面需求的人来说,可以借鉴一下。下面入正题:
我所实现的是在Flex前台中对Camera或播放的视频流进行截图,将其转换为二进制流,通过Socket,将二进制流发送给后台的Java,实现对图片的保存,起初我也觉得挺简单的,不想一做就做了老长的时间,真是特郁闷
1.Flex实现截图的功能
这个问题比较简单,所用到的类有:
public class BitmapData :想了很多方法,这个类都用上了(可能我思维局限吧,!)
public class ByteArray :将图象数据转换为字节流,此类也必不可少
使用以上两类完全可以实现对视频流的截图以及转换,不过Flex还提供了一个类可以实再这样的功能:
public dynamic class ImageSnapshot :看名字就知道是实现什么的了
以上的几个类说明及用法在 ActionScript 3.0 Language and Components Reference 这种参考文档里都可以找到,这里就不介绍了。我这的需求当中只需截图转换即可不需要第三个类来掺和。部分代码如下:
1 var byteArray:ByteArray=new ByteArray();
2 var bitmap:BitmapData=new BitmapData(vd.width,vd.height);
3 bitmap.draw(vd);
4 byteArray.writeInt(bitmap.width);
5 byteArray.writeInt(bitmap.height);
6 var byteArrayTemp:ByteArray=bitmap.getPixels(bitmap.rect);
7 byteArray.writeBytes(byteArrayTemp);
其中vd是要截取的视频流,代码已经很清楚了,就不写过多的费话了。这一部分结束;
2.Flex中Socket的实现
Socket 类使代码可以建立套接字连接并读取和写入原始二进制数据。这里所做的只是对主机地址及端口号进行设置,并对其进行监听,连接成功就可以发送数据了,这个的实再也是相当的简单,网上的资料也非常的多,具体的实再并不难找,在这就不过多的说了,跳过此节;
3.Java中的实现
在Java中所要做的事有:建立服务(设置端口号),接收数据,并对数据进行处理(生成相应的格式,在这里我只生成JPG的,其它道理相同)
这里做一下简要的介绍:
第一个介绍的当然是服务的建立:java.net.ServerSocket
1 import java.net.ServerSocket
2 private static ServerSocket server;
3 server = new ServerSocket(1024);
声明服务 ,设置端口号,要注意端口号必需大于等于1024,小于1024的都名花有主了,
第二个要做的就是监听了,也就是接收前台发送过来的数据,也可以将Flex前台理解为客户端,Java这边建立服务,可以称为服务器端,这样更易理解些。使用ServerSocket类的一个方法 accept,此方法在未接收到数据时是阻塞的:
1 import java.net.Socket;
2 private Socket socket;
3 socket = server.accept();
但要记住,此方法会抛出异常
第三件事就是接收数据,并进行处理了,也就是在这里,可以是理解的不到位,绕了不小的弯子,不过最终还是绕回来了:
在这是我要接收的的二进制流,数据基本都是二制的,所以要用到 :DataInputStream,让它来获取socket对象的输入流,相应的DataOutputStream获取socket对象的输出流来完成对客户端的响应,代码如下:
1import java.awt.Image;
2import java.awt.Toolkit;
3import java.awt.image.BufferedImage;
4import java.awt.image.MemoryImageSource;
5import java.io.DataInputStream;
6import java.io.DataOutputStream;
7import java.io.File;
8import java.io.FileOutputStream;
9import java.io.DataInputStream;
10import javax.imageio.ImageIO;
11try {
12 System.out.println("传输开始:");
13 file = new File("C:\\images\\image" + sum + ".jpg");
14 sum++;
15 DataInputStream dis = new DataInputStream(socket.getInputStream());
16 DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
17
18 FileOutputStream out = new FileOutputStream(file);
19 int width = dis.readInt();
20 int height = dis.readInt();
21 System.out.println("width:" + width+"--> height:"+height);
22 byte[] buffer1 = new byte[MAX_COUNT];
23 int size=width*4*height;
24 byte[] buffer=new byte[size];
25 int count=0,num=0;
26 while(true){
27 count=dis.read(buffer1,0,MAX_COUNT);
28 System.arraycopy(buffer1, 0, buffer, num, count);
29 num+=count;
30 System.out.println("length:" +num+"-->"+count);
31 if (num==size) {
32 Image TheImage = readImage32(buffer, height, width);
33 BufferedImage tag = new BufferedImage(width, height,
34 BufferedImage.TYPE_INT_RGB);
35 tag.getGraphics().drawImage(TheImage, 0, 0, width, height, null);
36 System.out.println(file.getName());
37// JPEGImageEncoder jpegImage = JPEGCodec.createJPEGEncoder(out);
38// jpegImage.encode(tag);
39 ImageIO.write(tag, "JPEG", out);
40 System.out.println("传输完成:");
41 out.close();
42 dis.close();
43 }
45 }
46
47 } catch (Exception e) {
48 e.printStackTrace();
49 } 上面就是接收数据处理的大部分代码,就不做解释了,其中的readImage32是对接收过来的二进制数据进行转换得到图片各像素点的值,具体代码就不贴了。
主要考滤到Flex在处理图片上进行格式的转换相当的慢,到无法忍受的地步,所以采用后台Java来处理,从实验的结果上看对前台不怎么影响,在一定程度上得到改善,希望有这方面经验的人多指点,提出宝贵的意见,
这是我第一次写Blog,请多多支持
posted @
2011-05-19 10:53 The Conqueror 阅读(2479) |
评论 (2) |
编辑 收藏