Flash 转 图片(swf to image)

  最近接到一个任务,需要将flash图表转化成图片,开始以为很简单。结果google了一下,发现网上关于java操作flash的文章极少,而且大部分是如何来制作flash文件,关于将flash文件转成图片,音频等等的几乎没有。

 

   http://www.flagstonesoftware.com这个网站提供的transform.jar似乎就是最权威的java flash api了,目前已经出来3.0beta1, 我用得是2.3.3。但是我发现他也没提供将flash文件成图片的API. 后来又goole了一圈,还是没有合适的,遂决定对transform.jar 的源代码进行深入研究。因为既然能将图片以一定的方式装进swf文件,那一定也可以以相反的方式转化回来,我只要看看它如何装进去的。

 

    引用这个API一般少不了FSMovie这个类, 发现这个类里有个decodeFromFile(String fileName) 的方法。看注释,这个方法是将swf文件解析成单个的对象,可以是声音,图片,帧,形状等等。因为我只需要图片,那我只需要对图片对象进行处理。经过一番实验,写了下面的代码,目前对jpg图片组成的swf是能够解析的。相信只要稍加处理,应该可以处理更多的类型。

 

 

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.zip.DataFormatException;

import javax.imageio.ImageIO;

import com.flagstone.transform.FSDefineJPEGImage2;
import com.flagstone.transform.FSMovie;
import com.flagstone.transform.FSMovieObject;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class SWFUtil {

    private static final long serialVersionUID = 1069978110917293106L;

    public void transformToIMG(String swfFilePath, String imgFilePath)
            throws IOException {
        FSMovie movie;
        try {
            movie = new FSMovie(swfFilePath);
        } catch (IOException e) {
            e.printStackTrace();
            return;
        } catch (DataFormatException e) {
            e.printStackTrace();
            return;
        }
        List<FSMovieObject> oList = movie.getObjects();

        for (FSMovieObject o : oList) {
            if (o.getType() == FSMovieObject.DefineImage
                    || o.getType() == FSMovieObject.DefineImage2
                    || o.getType() == FSMovieObject.DefineJPEGImage
                    || o.getType() == FSMovieObject.DefineJPEGImage2
                    || o.getType() == FSMovieObject.DefineJPEGImage3) {
                // System.out.println("catch image.... "+o.getType());

                // TODO add more logic to process different image type.
                // Currently there is only FSDefineJPEGImage2
                BufferedImage bio = ImageIO.read(new ByteArrayInputStream(
                        ((FSDefineJPEGImage2) o).getImage()));
                FileOutputStream fos = new FileOutputStream(imgFilePath);
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
                encoder.encode(bio);

                break;
            }
        }
    }

}

 对应的测试类如下(先用jpg图片生成swf,再对这个swf进行解析):

public class SWFUtilTest {

    public static final String SWF_FILE = "test/img.swf";

    public static final String IMAGE_TARGET_FILE = "test/img.jpg";

    public static final String IMAGE_SOURCE_FILE = "test/source.jpg";

    private static SWFUtil tool = null;

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        tool = new SWFUtil();
    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        tool = null;
    }

    @Test
    public final void testTransformToIMG() {

        try {
            createMovie(IMAGE_SOURCE_FILE, SWF_FILE);
            tool.transformToIMG(SWF_FILE, IMAGE_TARGET_FILE);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (DataFormatException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private void createMovie(String sourceIMG, String targetSWF)
            throws DataFormatException, IOException {
        FSMovie movie = new FSMovie();
        FSImageConstructor imageGenerator = new FSImageConstructor(sourceIMG);

        int imageId = movie.newIdentifier();
        int shapeId = movie.newIdentifier();

        int xOrigin = imageGenerator.getWidth() / 2;
        int yOrigin = imageGenerator.getHeight() / 2;

        FSDefineObject image = imageGenerator.defineImage(imageId);

        FSDefineShape3 shape = imageGenerator.defineEnclosingShape(shapeId,
                imageId, -xOrigin, -yOrigin, new FSSolidLine(20, FSColorTable
                        .black()));

        movie.setFrameRate(1.0f);
        movie.setFrameSize(shape.getBounds());
        movie.add(new FSSetBackgroundColor(FSColorTable.lightblue()));
        movie.add(image);
        movie.add(shape);
        movie.add(new FSPlaceObject2(shapeId, 1, 0, 0));
        movie.add(new FSShowFrame());
        movie.encodeToFile(targetSWF);
    }
}
 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在市场上,有许多软件可以用来将SWF文件换为Flash源文件。以下是其中一些常用的软件: 1. Sothink SWF Decompiler:这是一款功能强大的软件,可以将SWF文件换为FLA或FLEX源文件。它支持批量换,并能够提取SWF文件中的各种资源,如图像、声音、视频等。 2. 4Easysoft Flash Video Converter :这是一款专业的换工具,可以将SWF文件换为FLV或其他常见的视频格式。它具有用户友好的界面和高速换速度。 3. Adobe Flash Professional:这是一款专业的多媒体创作软件,可以使用它来创建、编辑和SWF文件。它提供了丰富的创作工具和效果,适用于专业设计师和开发人员。 4. Eltima SWF to FLA Converter:这是一款专门用于将SWF文件换为FLA文件的工具。它支持将SWF文件中的资源完整提取,并能够保留换后的源文件的原始质量和结构。 以上仅是其中一部分常用的SWF换工具,还有其他一些软件也可以完成类似的操作。在选择软件时,可以根据自己的需求和预算来进行选择。 ### 回答2: swf文件换为flash源文件的软件有很多,以下是一些常用的软件: 1. Adobe Animate:Adobe公司开发的专业动画制作软件,可以将swf文件换为flash源文件。它提供了丰富的动画制作和交互功能,是最常用的换软件之一。 2. SWF Decompiler:一款功能强大的解编译工具,可以将swf文件反编译为FLA源文件。它具有丰富的功能和用户友好的界面,可以帮助用户重新编辑并导出flash源文件。 3. Sothink SWF Decompiler:另一款强大的SWF解编译工具,可以将swf文件还原为flash源文件。它支持多种版本的flash文件,可以提取和编辑其中的元素,包括动画、图形、声音等。 4. Eltima SWF to FLA Converter:一款专业的swffla换工具,可以帮助用户将swf文件换为flash源文件。它支持批量换,可以保留原始文件的所有元素,并且提供了可视化的编辑界面。 5. Flash Decompiler Trillix:一款功能强大的swf反编译工具,可以将swf文件还原为flash源文件。它具有简洁的界面和丰富的功能,可以提取和编辑swf文件中的元素,包括图形、动画、声音等。 总结起来,这些软件是市场上比较常见的swf换为flash源文件的工具,用户可以根据自己的需求选择合适的软件进行换和编辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值