问题背景:我在做GEF的时候想把画出来的图片导出,生成一个gif格式的图片文件。使用SWT中Image类的getImageData()方法,但是图片很大的时候会出现错误,我分析原因可能是图片太大,无法一次性读出数据。于是我将大图片分割成若干小图片,将每个小图片依次存入到imageLoader.data中,并转换为ByteArrayOutputStream形式,最终生成了若干小图片。
问题目标:如何将若干个ByteArrayOutputStream合并在一起,生成完整的一张大图。
我的想法:我使用FileOutputStream的write方法,每次只能重新生成一个文件。是不是应该使用类似“追加”功能的方法,依次把多个小图片的ByteArrayOutputStream写到同一个文件里面,最终生成一个完整的大图片文件。我还没有找到这样的方法。
不知道我的思路对不对,请各位高手给些提示。谢谢

解决方案 »

  1.   

    1 能有多大的图片导致出错?难道图片比java虚拟机的内存还要大?出的什么错?
    2 你必须得知道GIF图形的byte编码方式才能 “拼”图形,参考 http://en.wikipedia.org/wiki/GIF你这么问问题就是无厘头,不能给别人提供准确地信息,别人也不知道你要干什么:)
      

  2.   

    哦,是我问题描述不准确吧,不好意思*_*
    我在IFigure上面绘制了一个图片,用SWT的Image类的image.getImageData()试图取得图片数据。当图片不太大的时候运行没有问题,当图片超过一定范围,比如占用的面积很大时,image.getImageData()方法运行不过去。不明白其中缘由。请高手指教,谢谢*_*
      

  3.   

    刚才我做了个试验,把image.getImageData()放到try中,catch可能出现的Error,代码如下:
    try{
        ImageLoader il = new ImageLoader();
        il.data = new ImageData[] { img.getImageData() };    // 保存地址和保存图片的类型
        il.save("c:/test.bmp", SWT.IMAGE_BMP);
        }catch(Error o){
    System.out.println("MemoryError:" + o);
        }
    当读取大图片的时候,捕获了下面的错误:
    MemoryError:java.lang.OutOfMemoryError: Java heap space我感觉是不是image.getImageData()对图片大小有限制啊,可是我没有找到相关的文档或者帮助,请高手指点,给点提示。谢谢
      

  4.   

    两种方法:1 加内存,增加JVM内存,启动的时候在Eclipse.exe加参数--vmargs -Xms 512M -Xmx1024m。Eclipse+调试GEF大概需要400多兆。
    2 不要使用裸byte[],那样全在内存中了,save之前不是有load(xx)吗?使用I/O,开辟一块固定的buffer,比如byte[4096]。
      

  5.   

    谢谢chiny的帮助。方法一确实能够解决问题,我试验了;方法二我还是不甚清楚,对于I/O一知半解,继续学习一下,不过个人觉得,还是方法二(修改算法)是更加可取的办法,从根上解决问题嘛,嘿嘿
    先把贴结了,继续研究方法二*_*