JAVA 以字节流读取文件中的BMP图像

用字节流而不是用JAVA的API函数read()有助于大家理解理解BMP的存储方式哈。

同时,从SQL中读取图片的话,也是用字节流读取,需要自己进行转换的。

顺便保存下代码。。。下次用就有模板了。。。

只有24位图的哈。

  public Image myRead(String path) throws java.io.IOException {
    Image image = null;  
    int biWidth,biHeight,bicount,biSizeImage,npad,head,information,size;
    try {
      FileInputStream fs = new FileInputStream(path);
      head = 14;
      /** 
       * head is 14bytes; 
       */
      byte header[] = new byte[head];
      fs.read(header, 0, head);
      information = 40;   
      /**
       * information is 40bytes;  
       */
      byte info[] = new byte[information];
      fs.read(info, 0, information);
      
      /**
       * get the wideth of the bmp 
       */
      biWidth = ((int)(info[7]&toDec))<<24 
          | ((int)(info[6]&toDec))<<16 
          | ((int)(info[5]&toDec)) << 8
          | ((int)(info[4]&toDec));
      
      /**
       *   get the heigth of the bmp
       */
      biHeight = ((int)(info[11]&toDec))<<24 
          | ((int)(info[10]&toDec))<<16 
          | ((int)(info[9]&toDec)) << 8
          | ((int)(info[8]&toDec));     
      bicount = (((int)info[15] & toDec) << 8) 
          | (int)info[14] & toDec; 
      
      /**
       * get the size of the image
       */
      biSizeImage = ((int)(info[23]&toDec))<<24 
          | ((int)(info[22]&toDec))<<16 
          | ((int)(info[21]&toDec)) << 8
          | ((int)(info[20]&toDec));
      

      if (bicount == 24) {
        /**
         *   compute the empty byte 
         */
        npad = (biSizeImage / biHeight) - biWidth*3;
        /**  
         * if the BitCount is 24, every pixel has 3  
         */
        if (npad ==4 ) {
          npad = 0;
        }
        /*  compute the size of pixel  */
        size = (biWidth + npad) * 3 *biHeight;
        byte alRgb[];
        if (npad != 0) {
          /**
           * creat a array to save RGB data
           */
          alRgb = new byte[(biWidth + npad) * 3 *biHeight];
        } else {
          /**
           * creat a array to save RGB data
           */
          alRgb = new byte[biSizeImage];
        }
        
        /*   read all rgb data  */
        fs.read(alRgb, 0 , size);
        int rgbData[] = new int[biHeight*biWidth];
        
        /*   translate hexadecimal data to decimal data   */
        int nindex = 0;
        for(int j = 0; j < biHeight; j++){  
          for(int i = 0; i < biWidth; i++){  
            rgbData[biWidth * (biHeight - j - 1) + i] =  
                (255 & 0xff) << 24  
                | (((int)alRgb[nindex + 2] & 0xff) << 16)  
                | (((int)alRgb[nindex + 1] & 0xff) << 8)  
                | (int)alRgb[nindex] & 0xff;  
            nindex += 3;  
          }  
          nindex += npad;  
        } 
        /*  creat image object */
        image = Toolkit.getDefaultToolkit().createImage(new MemoryImageSource(  
            biWidth, biHeight, rgbData, 0, biWidth));  
      }
      fs.close();  
    } catch (IOException e) {
      return null;
    }
    return image;  
  }
  
  public Image myWrite(Image image, String file ) throws java.io.IOException {
    try {
      int w = image.getHeight(null);
      int h = image.getWidth(null);
      /**
       * ceate graphic
       */
      BufferedImage bi = new BufferedImage(w,h,BufferedImage.TYPE_3BYTE_BGR);
      Graphics g = bi.getGraphics();
      g.drawImage(image, 0, 0, null);
      /*  open file */
      File iFile= new File(file+".bmp");
      ImageIO.write(bi, "bmp", iFile);
      } catch (IOException e) {
        return null;
      }
     return image;
  }

JAVA 以字节流读取文件中的BMP图像

时间: 2024-10-05 06:15:35

JAVA 以字节流读取文件中的BMP图像的相关文章

利用PushbackReader读取文件中某个字符串之前的内容

package File; import java.io.FileReader; import java.io.IOException; import java.io.PushbackReader; /*读取文件中某个字符串之前的文件*/ //PushbackInputStream,PushbackReader应用 public class PushbackTest { public static void main(String[] args) { try(PushbackReader pr

java多线程批量读取文件(七)

新公司入职一个多月了,至今没有事情可以做,十来个新同事都一样抓狂,所以大家都自己学习一些新东西,我最近在看zookeeper,感觉蛮不错的,和微服务的zuul以及eureka功能类似,只是代码复杂了一些.而今天,我所要说的是java多线程读取文件的两个例子: 例子1:java多线程批量读取文件 package face.thread.ReadFile; /** * 多线程读.写文件 *  */import java.io.BufferedReader;import java.io.Buffere

[转]java将字符串写入文件中

Java代码   import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.PrintStream; import java.io.PrintWriter; import java.io.RandomAccessFile; publi

IO流的练习5 —— 读取文件中的字符串,排序后写入另一文件中

需求:已知s.txt文件中有这样的一个字符串:“hcexfgijkamdnoqrzstuvwybpl” 请编写程序读取数据内容,把数据排序后写入ss.txt中. 分析: A:读取文件中的数据 B:把数据存在一个字符串中 C:把字符串转换成字符串数组 D:对字符串数组进行排序 E:数组转换成字符串 F:把字符串写入文件中 1 public static void main(String[] args) throws IOException { 2 // 读取文件中的数据 缓冲字符输入流 3 Buf

读取文件中的数据(以结构体存放)

/* *读取文件中的数据(数据以结构体存放) */ #include<iostream> #include <fstream> //#define Field 31 //field_anal number #define Field 15 //field_post number using namespace std; //the level restore certain level data //level_z show the level struct Level { int

Java IO把一个文件中的内容以字符串的形式读出来

代码记录(备查): /** * 把一个文件中的内容以字符串的形式读出来 * * @author zhipengs * */ public class FileToString { public static void main(String[] args) { System.out.println(readFileToString()); } private static String readFileToString() { // new 一个空文件,用于获取路径 File dirs = ne

分批读取文件中数据的程序流程及其C代码实现

一.概述 在实际的软件开发项目中,经常需要处理大量的文件.某些文件中包含了相当多的数据记录数,如作者本人参与过的项目中,一个文件中有好几十万条记录.如果一次性将多条记录读入,则会花费大量的处理时间,且占用大量的内存. 为此,要求对于包含大量数据记录的文件进行分批读取操作,即每一轮读取一定数目的数据记录,待将这些记录处理完成之后,再读取下一批数据.本文介绍分批读取文件中数据的程序流程,并给出了C程序实现. 二.总体程序流程 实现分批读取文件中数据的程序流程如图1所示. 图1 实现分批读取文件中数据

json数据处理:读取文件中的json字符串,转为python字典

方法1: 读取文件中的json字符串, 再用json.loads转为python字典 import json str_file = './960x540/config.json' with open(str_file, 'r') as f: print("Load str file from {}".format(str_file)) str1 = f.read() r = json.loads(str1) print(type(r)) print(r) print(r['under_

java.util.Properties 读取配置文件中的参数

用法 getProperty方法的返回值是String类型. java.util.Properties 读取配置文件中的参数 //读取配置文件 FileInputStream inStream = null; try { inStream = new FileInputStream("/fetchedfile/redis.conf"); Properties prop = new Properties(); prop.load(inStream); Field field; Strin