| 网站首页 | 科技前沿 | it产品项目 | 软件项目 | 硬件项目 | 发明专利 | 商业城 | 资源中心 | 博客 | 论坛 |  子站: it客栈 多奥网
会员中心
会员注册
繁體中文
推荐:索引 linux arm 手机 嵌入式 os wince dsp 音乐 游戏
 站内搜索:
项目资讯 资源中心
您现在的位置: 爱问科技网 >> IT产品项目 >> 综合 >> 文章正文
三种读取图片的方法       ★★★★
三种读取图片的方法
作者:佚名 文章来源:不详 更新时间:2006-11-23 20:26:22

最近抽空研究了一下有关PNG方面的东西(听说最近网上关于这个东西的讨论比较火)。再正式给出PNG研究心得之前,我先做个引线,把我接触过的三种读取资源文件的方法发上来,供大家讨论。如如果您有新的或是更好的方法,请一定要告诉我,我将十分感谢你(我的QQ:70705327)

下面就给出具体代码,与以往一样,我会在代码的适当位置使用注释。但我不会保证在我机器上可以运行的程序会在所有机器上运行(据说这可能是人品问题)。

import javax.microedition.lcdui.*;
import java.io.*;

public class ImageCanvas
    extends Canvas
{
  private Image byteImg;
  private InputStream input;
  public ImageCanvas()
  {
    try
    {
      jbInit();
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
  }

  /**
   * 三种方法任选一种
   * @throws Exception
   */
  private void jbInit() throws Exception
  {
    byteImg = this.readImage("/res/pic.bin", 11110); // 从一个合成包里读取资源,如*.bin文件
    //byteImg = Image.createImage("/res/caidan.png"); // 直接读取PNG文件
    //byteImg = this.importImage(this.caiDanImage()); // 从byte数组里记取资源,将资源像素保存在byte数组中
    System.out.println("内存情况: " +
                       Runtime.getRuntime().freeMemory() +
                       " / " + Runtime.getRuntime().totalMemory());//这种情况下会简单看下每种方法对内存的影响
    //this.getByte("/res/caidan.png");
  }

  /**
   * Reads a file from the BIN file and return data as an Image
   * @param binfile String 文件名
   * @param pos long 需要跳过的字节长度
   * @return Image 返回一个Image对像
   */
  public Image readImage(String binfile, long pos)
  {
    byte buffer[];
    int len;
    try
    {
      InputStream is = getClass().getResourceAsStream(binfile);
      is.skip(pos);
      len = (is.read() & 0xFF) << 24; // 如果不懂得这几句的意思,请留言给我,或是补习一下基本的编程知识
      len |= (is.read() & 0xFF) << 16;
      len |= (is.read() & 0xFF) << 8;
      len |= (is.read() & 0xFF);
      buffer = new byte[len];
      is.read(buffer, 0, buffer.length);
      is.close();
      is = null;
      System.gc();
    }
    catch (Exception e)
    {
      buffer = null;
      e.printStackTrace();
      System.gc();
      return null;
    }
    return Image.createImage(buffer, 0, buffer.length);
  }

  /**
   * 将资源文件转换为byte数组
   * @param file String 需要转换的文件名
   */
  private void getByte(String file)
  {
    byte[] myData = null;
    input = getClass().getResourceAsStream(file);
    try
    {
      ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
      int ch = 0;
      while ((ch = input.read()) != -1)
      {
        byteArray.write(ch);
      }
      for (int i = 0; i < byteArray.size(); i++)
      {
        myData = byteArray.toByteArray();
      }
      for (int i = 0; i < myData.length; i++)
      {
        System.out.println(myData[i] + ",");
      }
    }
    catch (Exception e)
    {}
    //return myData;
  }

  /**
   * 利用byte数据流生成图片
   * @param byteFile byte[] 图片文件byte数据流
   * @return Image 返回Image对象
   */
  private Image importImage(byte[] byteFile)
  {
    Image img = null;
    img = Image.createImage(byteFile, 0, byteFile.length);
    return img;
  }

  protected void paint(Graphics g)
  {
    /** @todo Add paint codes */
    g.setColor(0xffffff);
    g.fillRect(0, 0, this.getWidth(), this.getHeight());
    g.drawImage(byteImg, 30, 30, g.TOP | g.LEFT);
  }

  private byte[] xiangSuImage()
  {
    byte[] iCaiDanImage =
        { -119, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0,
        13, 73, 72, 68, 82, 0, 0, 0, 65, 0, 0, 0, 56,
        ......//未完的数据
        };
    return iCaiDanImage;
  }

}

总体来说,程序本身并没有难点,我只是想通过这篇文章来深入到PNG的研究当中,就像我们看到的,我们可以通过程序来操作PNG的基本元素(虽然本文中还没有),这其中可以包括PNG的四个基本数据块。这三种方法各有利弊,但竟世界上没有绝对完美的东西。
如果您对这方面感兴趣,请加我QQ:70705327 一起讨论。

文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    相关文章
    读取GIF图像中的一桢(动
    在Symbian OS中读取ZIP文
    使用CAknIconArray读取资
    更多内容
    专题栏目
    更多内容
    最新推荐 更多内容
    | 设为首页 | 加入收藏 | 关于我们 | 版权申明 | 友情链接 | 谷歌 雅虎 百度 | 管理登录 | 

    爱问科技网
    爱问科技网

    21aw@21aw.com
    粤icp备06099319