Flex中利用ByteArray与BitmapData互相转换实现图片的二进制保存与复原
近日在项目当中需要将图片保存到共享对象当中,开始用了俩天的时间做了对象的序列化,并以BitmapData的形式进行了图片的序列化保存共享,因为系统没有提供更好的接口所以无法测试,前天写好了测试代码,结果对象的其他类型的属性都可以访问了,但图片就是复原不了,到各大论天,技术网站考究了一天也没有答案,
只有“KingLong's”的“[AS3]BitmapBytes类-实现BitmapData与ByteArray(Base64)之间互转功能”一篇文章,看了半天,研究了半天,结果他把一个核心的类没有公开,我发了几次请求人家都没有给回,失败啊!无奈自己多花一点时间吧,这个是必须解决的。研究俩天终于在下午四点成功了,心情甚爽,晚上还改善了生活!
此问题在网上问的人太多了,但是高手就是觉得自己牛逼,不告诉你,菜鸟需要几天的时间甚至还会以失败告终,所以我今天贴出来供大家参考。转载请注明出处!!!谢谢合作
此类可以将一个可是组件读取为图像,并且以二进制形式进行序列化共享,还提供了二进制读取为Bitmap的方法,将图片的source属性直接赋值为本方法就可以了。此方法flex项目当中防止图片链接断开的最好解决办法。
注:本人水平太差,不知道怎样得出此方法的图片压缩和存储效率,仅是实现了功能!
下面是完整的类
package com.kyit.lg..util
{ /*
author:李广业
*/
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.utils.ByteArray;
import mx.core.UIComponent;
public class BitmapBytes
{
public function BitmapBytes()
{
super();
}
//将可视的UIComponent组件转换为ByteArray数组,我就是在UIComponent那里放了一个图片
public static function BitmapDataToByteArray(target : UIComponent):ByteArray{
var imageWidth:uint = target.width;
var imageHeight:uint = target.height;
var srcBmp:BitmapData = new BitmapData( imageWidth, imageHeight );
//将组件读取为BitmapData对象,bitmagData的数据源
srcBmp.draw( target );
//getPixels方法用于读取指定像素区域生成一个ByteArray,Rectangle是一个区域框,就是起始坐标
var pixels:ByteArray = srcBmp.getPixels( new Rectangle(0,0,imageWidth,imageHeight) );
//下面俩行将数据源的高和宽一起存储到数组中,为翻转的时候提供高度和宽度
pixels.writeShort(imageHeight);
pixels.writeShort(imageWidth);
return pixels;
}
//次方法的参数必须是像上面的ByteArray形式一样的,即需要对象的大小;
//此方法返回的Bitmap可以直接赋值给Image的source属性
public static function ByteArrayToBitmap(byArr:ByteArray):Bitmap{
if(byArr==null){
return null;
}
//读取出存入时图片的高和宽,因为是最后存入的数据,所以需要到尾部读取
var bmd:ByteArray= byArr;
bmd.position=bmd.length-2;
var imageWidth:int = bmd.readShort();
bmd.position=bmd.length-4;
var imageHeight:int= bmd.readShort();
var copyBmp:BitmapData = new BitmapData( imageWidth, imageHeight, true );
//利用setPixel方法给图片中的每一个像素赋值,做逆操作
//ByteArray数组从零开始存储一直到最后都是图片数据,因为读入时的高和宽都是一样的,所以当循环结束是正好读完
bmd.position = 0;
for( var i:uint=0; i<imageHeight ; i++ )
{
for( var j:uint=0; j<imageWidth; j++ )
{
copyBmp.setPixel( j, i, bmd.readUnsignedInt() );
}
}
var bmp:Bitmap = new Bitmap( copyBmp );
return bmp;
}
}
}
以下是mxml文件,只是我做测试用的没有进行序列化,有需要的留言给我,
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import com.kyit.lg.util .BitmapBytes;
private var byteArr:ByteArray;
internal function copyToTar():void{
//这俩个方法都是静态的,因为项目当中常用
byteArr=BitmapBytes.BitmapDataToByteArray(sorImg);
tarImg.source=BitmapBytes.ByteArrayToBitmap(byteArr);
}
]]>
</mx:Script>
<mx:Image x="33" y="56" id="sorImg" source="a.jpg"/>
<mx:Image x="33" y="265" id="tarImg" />
<mx:Button x="33" y="26" label="a1" click="copyToTar();" />
分享到:
相关推荐
在AS3(ActionScript 3)中,将PNG图片转换为二进制数据是一种常见的优化图像加载和显示的方法。这主要是因为二进制数据能够更有效地处理和传输,特别是对于大量图片的应用,如游戏或者多媒体项目。以下是关于这个...
本篇将深入探讨如何在C#中进行二进制数组与常规数组之间的转换,以及二进制序列化和JSON序列化的应用及其反序列化过程。 首先,让我们来看看二进制数组与常规数组之间的转换。在C#中,二进制数组通常用byte[]表示,...
标题中的“Flex 与 Struts2 ByteArray 数据上传”指的是在Web开发中,使用Adobe Flex作为前端客户端,通过Struts2框架在后端处理字节数组(ByteArray)数据的上传技术。Flex是一种基于Adobe Flash Player或Adobe AIR...
在本示例中,我们看到一个完整的ActionScript 3.0类`Main`,它定义了一个用于读取外部图片文件并以二进制格式显示的程序。 #### 1.1 类的基本结构 - `Main`类继承自`Sprite`,这是AS3中常见的做法,用于创建图形...
2. **ByteArray**: AS3中的一个类,用于处理字节流数据,可以读写各种类型的数据,包括二进制音频数据。 3. **Sound**: AS3中的一个类,表示声音对象,可以加载、播放和控制音频。 4. **MP3**: 常见的音频压缩格式,...
在Flex中,我们可以利用Chart的`copyToBitmap`方法将图表转换为BitmapData,然后再进行保存。 2. **SaveWebcam.mxml** - 这个文件可能涉及使用Flash Player的摄像头API来捕捉实时视频帧,并将这些帧保存为图片。...
本文将详细讲解如何实现Flex中的图片保存,包括单个UI组件的截图以及整个应用框架的截图。 首先,理解Flex的基础。Flex是一种基于ActionScript 3.0的开放源代码框架,用于构建富互联网应用程序(RIA)。它允许...
1. **bytes和bytearray**: Python 3 中,`bytes` 类型用于表示不可变的二进制序列,而 `bytearray` 则是可变的版本。它们都是由8位整数组成,可以用于处理任何二进制数据,如图片、音频文件或网络数据包。 2. **...
### Flex 中使用 `FileStream` 和 `ByteArray` 实现图片另存 #### 1. **基础知识简介** - **Flex**:一种用于构建跨平台桌面应用程序和移动应用程序的技术。它基于Adobe Flash Player运行时环境,并使用MXML...
本案例将深入探讨如何利用VB2005进行二进制文件的读取与写入,以帮助开发者更好地理解和应用这些技术。 首先,我们要了解二进制文件与文本文件的区别。二进制文件存储原始数据,不关心字符编码,而文本文件通常基于...
基于bytearray 的python二进制缓存的封装,能够根据位置获取指定类型的值,方便PYTHO编程中对二进制数据的操作
总之,理解如何在C#中处理二进制数据和在结构体与字节数组之间转换是提升编程能力的重要一步,这使你能够处理底层数据,实现高效的文件读写、网络通信等功能。通过实践和熟悉相关API,你可以在实际项目中更好地应用...
本主题将详细探讨如何使用Flex来以二进制流的形式上传图像,以及如何将BitmapData对象转换为ByteArray,以便进行网络传输。 在Flex中,图像可以被表示为BitmapData对象,它包含了图像的所有像素信息。在上传图像时...
通过这种方式,Flex与JavaServlet的集成使得我们能够跨平台地处理图像数据,将Flex应用程序的组件快照导出为实际的图片文件。这种技术在需要将用户界面截图保存或分享的场景中非常有用,例如在设计工具、教学演示...
上述代码中的fileReference.save()方法就是利用它来实现图片的本地保存。 6. **安全限制**:需要注意的是,由于Flash Player的安全沙箱限制,只有在用户交互后(如点击按钮)才能使用FileReference保存文件,否则会...
为了实现上传图片的预览功能,我们需要在用户选择文件后,利用JavaScript与Flash Player的通信,将选取的图片数据传递到Flex应用中。 1. **HTML表单与Flex通信**: - 使用`FileReference`对象:这是Flash Player...
下面我们将深入探讨如何在Flex中实现将组件保存为本地PNG图片。 1. **Flex组件渲染** Flex组件是以ActionScript 3为基础的对象,它们在运行时由Flash Player或Adobe AIR渲染为像素。要将组件保存为图片,首先需要...
了解如何在VB6中进行这种转换对于理解和处理二进制数据至关重要。 首先,让我们来了解一下ASCII码。ASCII码是一种基于拉丁字母的一套电脑编码系统,最初被设计为7位的二进制数来表示128种可能的字符,包括大小写...
在Python编程语言中,处理二进制文件是一项重要的任务,特别是在数据存储、文件解析和网络通信等领域。二进制文件通常包含非文本数据,如图片、音频、视频或任何其他机器可读的数据。与文本文件不同,二进制文件不能...
### Flex 加载Base64编码的二进制字符串图片 #### 概述 在Flex开发中,有时我们需要处理Base64编码的二进制数据,尤其是图像数据。Base64编码是一种常用的数据编码方式,可以将二进制数据转换为文本格式以便在网络...