[转]解析QQ三国图片

package {
import flash.display.*;
import flash.events.Event;
import flash.net.*;
import flash.utils.*;

public class SGIMG extends Sprite
{
public var load:URLLoader = new URLLoader();
private var _bmp:Bitmap = new Bitmap();
private var _ext:String;
private var rootPath:String = "D:\\WorkSpace\\QQSG\\DATA\\res\\";
private var imgHeight:int,imgWidth:int;

public function SGIMG()
{
this.stage.scaleMode = StageScaleMode.NO_SCALE;
this.stage.align = StageAlign.TOP_LEFT;
load.dataFormat = URLLoaderDataFormat.BINARY;
load.addEventListener(Event.COMPLETE,comHandler);
//loadFile("UiRes\\Version04\\Login\\logo2.gsa");
//loadFile("res\\MapRes\\denglu\\yun00.gso");
//loadFile("UiRes\\Version04\\Login\\Job\\Image\\dddd.bmp");
}
private function loadFile(filePath:String):void{
var url:URLRequest = new URLRequest(rootPath + filePath);
load.load(url);
var leng:int = url.url.length;
_ext= url.url.substr(leng - 3,3);

}
private function comHandler(evt:Event):void{
var b:ByteArray = load.data;

b.endian = Endian.LITTLE_ENDIAN;
var imgHeader:Object = new Object();
trace(b.readMultiByte(8,"utf-8"));//图片格式
//--------------说明图象数据压缩的类型-----------------
var offest:int = 11;//gso:DIMG为11,gsa:IANI为4
if(_ext == "gso" || _ext == "gsn"){
offest = 17;//DIMG dds格式 RGB 44444
}else if(_ext == "gsa"){
offest = 11;//IANI bmp格式
}
var headeData:Array = new Array();
for(var index:int = 0; index < offest; index++){
headeData[index] = b.readInt();
trace(index,"---------",headeData[index]);
}
imgWidth = headeData[4];//说明水平分辨率
imgHeight = headeData[5];//说明垂直分辨率
//-------------------------------------------------
//--------------------实际图像数据------------------------
var imgData:Array = new Array(imgHeight);
for(var row:int=0; row < imgHeight; row++){
imgData[row] = new Array(imgWidth);
for(var col:int = 0; col < imgWidth; col++){
if(_ext == "gso" || _ext == "gsn"){
imgData[row][col] = getPixel(b) ;
}else if(_ext == "gsa"){
//imgData[row][col] = b.readUnsignedInt();
imgData[row][col] = getPixel(b)
//trace(imgData[row][col].toString(16));
}
}
}
trace(b.bytesAvailable);

if(_ext == "gso" || _ext == "gsn"){
//数据结尾
var tempData:Array = new Array();
for(var x:int = 0; x < 6; x++){
tempData[x] = b.readInt();
}
}
trace(b.bytesAvailable);

addChild(drawImage(imgData));
}
public function getPixel(b:ByteArray):uint{
var colorA:uint = b.readUnsignedByte();//GB
var colorB:uint = b.readUnsignedByte();//AR
return h4(colorB) << 24 | l4(colorB) << 16 | h4(colorA) << 8 | l4(colorA);//RGB
}
public function h4(n:uint):uint{
var d:uint = (n & 0xF0) >> 4;//取高4位
return d << 4 | d;//A转为AA
}
public function l4(n:uint):uint{
var d:uint = (n & 0xF);//取低4位
return d << 4 | d;//A转为AA
}
public function drawImage(imgData:Array):Bitmap{
var bmd:BitmapData = new BitmapData(imgWidth, imgHeight, true, 0xff000000);
for(var row:int=0; row<imgHeight; row++){
for(var col:int=0; col<imgWidth; col++){
bmd.setPixel32(col, row, imgData[row][col] );
}
}
_bmp.bitmapData = bmd;
trace("------sss-----",imgWidth,imgHeight);
return _bmp;
}
}
}
一、浏览   执行文件菜单中的打开。如果你是第一次查看这个游戏,RPGVierer[1]会弹出对话框让你选择游戏的路径,一般选择游戏主程序所在目录即可   之后就可以用浏览菜单或者浏览工具栏查看游戏中的图片了。   如果遇到不支持的图片格式或者读取图片时发生错误,RPGViewer[2]会在状态栏显示相关的出错信息。   二、搜索   可以根据文件名查找图片。支持查找的游戏列表详见附录1   搜索支持模糊查找、区分大小写和正则表达式,正则表达式的具体定义参见附录3   三、导出(支持bmp、jpg、png和mng格式,mng格式的说明参见附录2。另外支持导出为三国群英传的SHP格式)   RPGViewer提供三种导出功能:   1、当前帧   导出当前显示的图片   2、当前图片   当图片仅有一帧时,和导出“当前帧”相同。否则将导出该图片的所有帧。   3、所有图片   导出所有图片(!注意:如果图片有多帧,那么此功能会导出所有帧!)   注:有些导出图片的高度是负的,可能在某些图片浏览器中不能正常显示。建议使用Irfanview或PhotoShop进行查看和编辑   全部导出功能会将所有的图片导出到目标文件夹中,文件名依次为1-1.bmp,2-1.bmp...   四、导入(支持bmp、gif、jpg和png格式)   你可以导入bmp或者png(支持透明色和alpha通道)格式的图片(注:“导入”操作只是引入了一个替换的标记,此时并未进行实际的替换)   如果想取消对当前图片的替换可以使用“导入”菜单中的“还原”   全部图像都替换完之后,执行“导入”菜单中的“保存”,所作的替换就会生效   五、压缩包操作   可以提取游戏数据包中的所有文件,并支持部分游戏的文件替换。支持解包和替换的游戏列表详见附录1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值