工具名称:JPG转PNG工具(jpg2png.exe)
使用说明:命令行方式使用,如:jpg2png.exe a.png b.png c.png
(或可直接拖动多个文件到图标上)
---by yoyo(//yoyo.play175.com)
这款工具可以去除jpg图片中的黑色背景,并以增加模式改善图片原有的通道亮度,在提取游戏中的特效资源中,这款工具非常有用。
转换前jpg图片:
转换后png图片:
下载地址:jpg2png.zip
工具名称:JPG转PNG工具(jpg2png.exe)
使用说明:命令行方式使用,如:jpg2png.exe a.png b.png c.png
(或可直接拖动多个文件到图标上)
---by yoyo(//yoyo.play175.com)
这款工具可以去除jpg图片中的黑色背景,并以增加模式改善图片原有的通道亮度,在提取游戏中的特效资源中,这款工具非常有用。
转换前jpg图片:
转换后png图片:
下载地址:jpg2png.zip
工具描述:ico转PNG工具(ico2png.exe)
使用说明:只支持命令行方式使用,如:ico2png.exe a.ico b.ico c.ico
(或可直接拖动多个文件到图标上)
---by yoyo(//yoyo.play175.com)
可以把ico文件中的所有格式的图标转为png图片存储到ico文件所在的目录下,如下图所示:
下载地址:ico2png.zip
闪客精灵和asv都可以从swf中提取图片,但是图片和导出as类链接的对应关系没有导出,最近看了一下swf文件格式,除了doabc代码比较复杂,其他tag导出还是比较简单的,swf中和图片关联的tag有:DefineBitsLossless,DefineBitsJPEG2,DefineBitsLossless2,DefineBitsJPEG3,参照了网上其他开源项目的代码,用C写了一个工具:swfread.exe,可以把swf里面的png、jpg等图片素材全部提取出来。
11月15日更新:支持中文类名
12月25日更新:支持zws为标识的lzma压缩算法
工具名称:提取swf中的图片 使用说明:swfread.exe a.swf b.swf c.swf (或可直接拖动多个swf到图标上)
附件下载:swfread.zip(133KB)
(注意:本程序并没有病毒或其他破坏性的代码,请注意chrome浏览器中下载时会提示:不是常见的下载类型,可能存在危险。如不放心,请勿使用)
顺带推荐一下我写的另一个小工具,可以从任意进程里提取swf出来:swfdump
给你一个文件或者二进制,不知道编码是gb2312还是utf8的情况下怎么正确读取出文本呢?
以下代码是as3的,其他编程语言只要稍微改动一下即可。
上代码,请直接用!
感谢C++ BLOG提供的判断utf8的方法://hi.baidu.com/xingyan126/item/4abec1c1c2143755bcef6956
/**
* 从未知编码的二进制流中读取文本
* @param ba
* @param len 读取长度,默认为-1,则读取至文件尾
* @return
*/
public static function readString(ba:ByteArray,len:int = -1):String
{
if ((len != -1 && len > ba.bytesAvailable) || (len == -1)) len = ba.bytesAvailable;
var encode:String = 'gb2312';
//先判断头三个字节是不是utf bom
if (ba.bytesAvailable >= 3)
{
//0xEF 0xBB 0xBF
var chkarr:Array = [];
var a:int = 0xffffffEF;
var b:int = 0xffffffBB;
var c:int = 0xffffffBF;
chkarr.push(ba.readByte());
chkarr.push(ba.readByte());
chkarr.push(ba.readByte());
if ((chkarr[0] == a && chkarr[1] == b && chkarr[2] == c))
{
//utf-8 bom
encode = 'utf-8';
return ba.readMultiByte(len - 3, encode);
}
else
{
ba.position -= 3;
}
}
//逐个字节判断是否有UTF8的编码
if (isUTF8(ba, len))
{
encode = 'utf-8';
}
return ba.readMultiByte(len - 3, encode);
}
/**
* 判断文本是否是UTF8编码
* @param ba
* @param len 读取长度,默认为-1,则读取至文件尾
* @return
*/
public static function isUTF8(ba:ByteArray,len:int = -1):Boolean
{
if ((len != -1 && len > ba.bytesAvailable) || (len == -1)) len = ba.bytesAvailable;
var score:int = 0;
var i:int;
var goodbytes:int = 0, asciibytes:int = 0;
// Maybe also use UTF8 Byte Order Mark: EF BB BF
// Check to see if characters fit into acceptable ranges
var oldpos:int = ba.position;
var byte:int, byte1:int, byte2:int;
var curlen:int = len;
while(curlen>0)
{
ba.position = oldpos + (len - curlen);
byte = ba.readByte();
curlen -= 1;
if (curlen >= 1) byte1 = ba.readByte();
if (curlen >= 2) byte2 = ba.readByte();
//0x7f = 127 = 01111111
if ((byte & 0x7F) == byte)
{
// 最高位是0的ASCII字符
asciibytes++;
// Ignore ASCII, can throw off count
}
else if (-64 <= byte && byte <= -33
//-0x40~-0x21
&& // Two bytes
curlen >= 1 && -128 <= byte1
&&
byte1<= -65)
{
goodbytes += 2;
curlen -= 1;
}
else if (-32 <= byte
&& byte <= -17
&& // Three bytes
curlen >= 2 && -128 <= byte1
&& byte1 <= -65 && -128 <= byte2
&& byte2 <= -65)
{
goodbytes += 3;
curlen -= 2;
}
}
ba.position = oldpos;
if (asciibytes == len)
{
return false;
}
score = 100 * goodbytes / (len - asciibytes);
// If not above 98, reduce to zero to prevent coincidental matches
// Allows for some (few) bad formed sequences
if (score > 98) {
return true;
} else if (score > 95 && goodbytes > 30) {
return true;
} else {
return false;
}
}
在chrome等浏览器会有这个问题, 需要在html页面用js捕捉滚轮事件,然后传入到flash里面,难点是到flash之后该怎么办,我这里采用类类似冒泡的方式来触发事件。
js代码,参考自://www.denisdeng.com/?p=685
function wheel(obj, fn ,useCapture){
var mousewheelevt=(/Firefox/i.test(navigator.userAgent))? "DOMMouseScroll" : "mousewheel"
//FF doesn't recognize mousewheel as of FF3.x
if (obj.attachEvent)
//if IE (and Opera depending on user setting)
obj.attachEvent("on"+mousewheelevt, handler, useCapture);
else if (obj.addEventListener)
//WC3 browsers
obj.addEventListener(mousewheelevt, handler, useCapture);
function handler(event) {
var delta = 0;
var event = window.event || event ;
var delta = event.detail ? -event.detail/3 : event.wheelDelta/120;
if (event.preventDefault)
event.preventDefault();
event.returnValue = false;
return fn.apply(obj, [event, delta]);
}
}
function addMouseWheelListener(){
var target = document.getElementById('flashobjID');
wheel(target,callWheel);
}
function callWheel(e,delta) {
var target = document.getElementById('flashobjID');
if(target!=undefined && target && target.fireWheel)
{
//调用flash的方法
target.fireWheel(delta);
}
}
//页面加载完,附近鼠标事件侦听
window.onload = addMouseWheelListener;
flash代码:
ExternalInterface.addCallback('fireWheel', function(delta:int):void{
//获取当前鼠标下面的所有对象
var arr:Array = stage.getObjectsUnderPoint(new Point(stage.mouseX, stage.mouseY));
if (arr.length == 0) return;
//只找最接近鼠标的那一层来触发就好了,底下的挡住了不管
var obj:DisplayObject = arr[arr.length-1];
//从叶子节点,一层一层往根上找
while (true)
{
if (obj is InteractiveObject)
{
var intobj:InteractiveObject = obj as InteractiveObject;
if (intobj is TextField)
{
//TextField似乎不接受外部触发的滚轮事件,只能暴力
if ((intobj as TextField).mouseEnabled)
{
(intobj as TextField).scrollV -= delta;
}
}
else if (obj.hasEventListener(MouseEvent.MOUSE_WHEEL))
{
var me:MouseEvent = new MouseEvent(MouseEvent.MOUSE_WHEEL, false, false, 0, 0, intobj);
me.delta = delta;
obj.dispatchEvent(me);
}
}
if (obj == stage || (!obj.parent))
{
break;
}
obj = obj.parent;
}
});