`
zhanglongsr
  • 浏览: 1626 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

java下24bit位图转化为16bit位图实现

阅读更多
关于bmp文件内部存储格式参看:http://www.yymcu.com/resource/BMP%CE%C4%BC%FE%B8%F1%CA%BD%B7%D6%CE%F6.htm
以下是转换的具体java实现,已经通过单元测试,copy之后能直接使用:
public class TransactionBmpTo16Bit{
private String resFilePath;
private String desFilePath;
private Bmp currentBmp = null;

public TransactionBmpTo16Bit(String resFilePath,String desFilePath){
  this.resFilePath = resFilePath;
  this.desFilePath = desFilePath;
}

/**
  * 把24bit的bmp图像转换为16bit的图像
  *
  * @return
  */
public boolean transacte(){
  currentBmp = new Bmp();
  try {
   byte[] fileContent = currentBmp.loadBmp(resFilePath);
   Bmp desBmp = new Bmp();
   byte[] changeContent = this.changeContent(fileContent);
   desBmp.setCurrent(changeContent);
   desBmp.save(desFilePath);
  } catch (IOException e) {
   e.printStackTrace();
   return false;
  } catch (BusinessException e) {
   e.printStackTrace();
   return false;
  }
  return true;
}

/**
  * 获得新文件的大小
  *
  * @return
  */
private int getNewFileSize(){
  return  currentBmp.getWeight()*currentBmp.getHight()*2+currentBmp.getDataOffset();
}

private byte[] changeContent(byte[] current){
 
  int newSize = this.getNewFileSize();
  byte[] newByt = new byte[newSize];
  for(int i=0;i<currentBmp.getDataOffset();i++){
   newByt[i] = current[i];
  }
  /*设置新的位图大小*/
  byte[] sbt = NumberConversion.intToBytes(newSize,4);
  for(int i=2;i<6;i++){
   newByt[i]=sbt[5-i];
  }
  /*设置新的像素位数*/
  byte[] pixDigit = NumberConversion.intToBytes(16,2);
  newByt[28] = pixDigit[1];
  newByt[29] = pixDigit[0];
 
 
  //TODO 获得转化后的数据实现
  int dataSize = newSize-54;
 
  byte[] newData = new byte[dataSize];
 
  byte[][] data = this.getFiltratedArray(current);
  int tt = 0;
  for(int i=0;i<currentBmp.getHight();i++){
  
   for(int j=0;j<currentBmp.getWeight()*3;j++){
    tt+=1;
    if((j+1)%3==0){
     byte n = (byte) ((((data[i][j-1])>>>5)&0x7)|(data[i][j]&0xF8));
     byte m = (byte) (((data[i][j-2]>>>3)&0x1F)|((data[i][j-1]&0x1c)<<3));
     int index = tt/3*2;
     newData[index-2] = m;
     newData[index-1] = n;
    }
   }
  }
  for(int i=54;i<newSize;i++){
   newByt[i] = newData[i-54];
  }
  return newByt;
}

/**
  * 过滤bmp补位的数据
  * @return
  */
private byte[][] getFiltratedArray(byte[] current){
 
  int residue = (this.currentBmp.getWeight()*3)%4;
  int skip = 0;
  if(residue!=0) skip = 4-residue;
 
  byte[][] array = new byte[this.currentBmp.getHight()][this.currentBmp.getWeight()*3];
 
  int scale = this.currentBmp.getDataOffset();
 
  for(int i=0;i<this.currentBmp.getHight();i++){
//   scale += i*hight;
   for(int j=0;j<this.currentBmp.getWeight()*3;j++){
   
    array[i][j] = current[scale];
    scale += 1;
   }
//   System.out.println("scale="+scale);
   scale+=skip;
//   System.out.println("scale1="+scale);
  }

  return array;
 
}

}

<!----------------------------------------------------
public class Bmp {

protected final Log logger = LogFactory.getLog(getClass());

public final static int BITMAPFILEHEADER_SIZE = 14;

public final static int BITMAPINFOHEADER_SIZE = 40;
/*文件大小*/
private int size;
/*文件宽度*/
private int weight;
/*文件高度*/
private int hight;
/*数据偏移量*/
private int dataOffset;
private byte[] current;
private String filePath;

/*get(),set()方法考虑到节省篇幅,请自行设置*/

public Bmp(){
 
}

/**
  * 加载bmp文件
  *
  * @param filePath
  * @return
  * @throws IOException
  * @throws BusinessException
  */
public byte[] loadBmp(String filePath) throws IOException, BusinessException{
 
  this.filePath = filePath;
  this.setParam();
 
  return current;
}

/**
  * 保存bmp文件
  *
  * @param desPath
  * @throws BusinessException
  * @throws IOException
  */
public void save(String desPath) throws BusinessException, IOException{
  if(current==null){
   throw new BusinessException("",null);
  }
 
  FileOutputStream fos = new FileOutputStream(desPath);
  fos.write(current,0,current.length);
  fos.flush();
  fos.close();
}

private void setParam() throws IOException, BusinessException{
 
  /*判断源文件是否是bmp格式,后缀可以是.bmp、.dib、.rle*/
  if(!filePath.contains(".bmp")){
   throw new BusinessException("",null);
  }
 
  FileInputStream  fis = new FileInputStream(filePath);
  /*bmp文件头存储*/
  byte[] fh = new byte[BITMAPFILEHEADER_SIZE];
  fis.read(fh,0,BITMAPFILEHEADER_SIZE);
  /*文件头信息存储*/
  byte[] hi = new byte[BITMAPINFOHEADER_SIZE];
  fis.read(hi,0,BITMAPINFOHEADER_SIZE);
 
  /*设置文件长度*/
  this.size = (((int)fh[5]&0xff)<<24)
            | (((int)fh[4]&0xff)<<16)
             | (((int)fh[3]&0xff)<<8)
              | (int)fh[2]&0xff;
  /*设置文件宽度*/
  this.weight = (((int)hi[7]&0xff)<<24)
            | (((int)hi[6]&0xff)<<16)
             | (((int)hi[5]&0xff)<<8)
              | (int)hi[4]&0xff;
  /*设置文件高度*/
  this.hight = (((int)hi[11]&0xff)<<24)
      | (((int)hi[10]&0xff)<<16)
       | (((int)hi[9]&0xff)<<8)
        | (int)hi[8]&0xff;
  /*设置位图数据阵列起始偏移量*/
  this.dataOffset = (((int)fh[13]&0xff)<<24)
             | (((int)fh[12]&0xff)<<16)
              | (((int)fh[11]&0xff)<<8)
               | (int)fh[10]&0xff;

  fis.close();
  loadAll();
}

private void loadAll() throws IOException{
 
  FileInputStream  fis = new FileInputStream(filePath);
  current = new byte[size];
 
  fis.read(current,0,size);
 
  fis.close();
}
}
<!----------------------------------
public class NumberConversion {

/**
  * 整形转化为二进制字节
  *
  * @param number  需要转化的数字
  * @param bytes   字节数
  * @return
  */
public static byte[] intToBytes(int number,int digit){
 
  byte[] byts = new byte[digit];
//  int mask=0xff;
  int basic = 8*(digit-1);
  for(int i=0;i<digit;i++){
   byts[i] = (byte)(number>>>(basic-i*8));
  }
 
  return byts;
 
}

/**
  *
  * @param bytes
  * @return
  */
public static int bytesToInt(byte[] b){
 
  int mask=0xff;
  int temp=0;
  int res=0;
 
  for(int i=0;i<4;i++){
         res<<=8;
         temp=b[i]&mask;
         res|=temp;
  }
  return res;

}
}

分享到:
评论

相关推荐

    位图转换程序(16bit to 24bit)

    在这个特定的案例中,我们关注的是从16位565格式的位图转换为24位位图,然后再进一步转换为8位256色的位图。这种转换在图形处理和图像显示领域中具有重要意义,因为不同的设备和软件可能支持不同的位深度。 16位565...

    24位图转16位图工具

    “24位图转16位图工具”正是针对这种需求设计的,它允许用户批量转换指定目录下的所有24位BMP图像为16位格式。这个过程通常涉及到色彩量化,即将24位色彩空间中的颜色映射到16位色彩空间的过程。算法会优化颜色分配...

    一个效果非常好的24,16bit真彩位图转化成256彩色或黑白位图的演示程序

    这个“一个效果非常好的24,16bit真彩位图转化成256彩色或黑白位图的演示程序”就是针对这一需求而设计的。 位图转换的核心在于色彩量化。24位真彩色位图可以表示16,777,216种颜色(256^3),而256色位图则限制在256...

    BMP 24位图转16位位图的程序 exe

    24位BMP图片转565格式16位数组C文件代码,生成的代码用于嵌入式程序代码中图片文件显示,BMP图片以数组的形式保存并读取

    bmp 位图转换(可将24 位t转为16 / 8 / 4 位)

    封装的一个将24BitCount 的bmp 转换为16bitCount 或8bitcount 或4Bitcount类。并保存。此接口只需要输入要转换图片的路径就可以获得转换后图片的bitmap。此接口在兼容各种平台

    C_transpart_in_dos.rar_16bit_24 to 16_C++

    实现了8bit,16bit,24bit,32bit的位图透明处理。全部是用C的标准库函数实现,没有使用任何win32API.有的嵌入式平台没有提供对图片的透明功能。可以对此代码修改后使用。另外可以用来学习位图结构与透明算法。

    linux下bmp24位转16位

    在Linux环境下,将一个24位的BMP(Bitmap)图像转换为16位的BMP格式是一项常见的图像处理任务。BMP是一种无损的图像文件格式,它以位(bits)来存储像素颜色信息。24位BMP每个像素由红、绿、蓝三个颜色通道组成,每...

    VC将HBITMAP转换成BMP位图文件的各个部分

    这样的转换可以方便地保存或传输图像数据,并且能够支持不同的颜色深度,如1BIT、4BIT、8BIT、16BIT、24BIT、32BIT。 #### 二、关键知识点解析 **1. HBITMAP与BMP文件格式简介** - **HBITMAP**: 在Windows系统中...

    利用c++将16位图像转换为8位图像,支持批量

    标题中的“利用C++将16位图像转换为8位图像,支持批量”是指通过C++编程语言实现图像处理功能,将原本16位深度的图像数据转化为8位深度的图像,同时支持对多张图像进行批量转换。这种转换在图像处理领域中常见,因为...

    (序列图像)16位转8位(OpenCV)

    在某些情况下,我们需要将16位图像转换为8位图像,这可能是为了减少文件大小、提高处理速度或兼容某些软件。在本主题中,我们将深入探讨如何使用OpenCV库在Python中实现这个转换过程,特别是针对序列图像。 OpenCV...

    利用python将16位图像转换为8位图像,支持批量

    在图像处理领域,有时我们需要将高动态范围的图像(如16位图像)转换为低动态范围的图像(如8位图像)。这个过程通常是为了适应显示设备或进行特定的算法处理。本文将深入探讨如何使用Python来实现16位图像到8位图像...

    DGUS 实时显示图像数据

    16bit位图数据通常由两个8bit的像素组成,分别表示红色、绿色和蓝色的亮度值,这种格式在有限的硬件资源下能够实现较好的图像质量。 生成图标库是将用户图像转化为DGUS可用格式的关键步骤。我们需要使用专用的工具...

    简析Bitmap文件格式

    在高颜色深度的BMP格式中,颜色的表示更加细腻,例如16bit位图可以有65536种颜色,而32bit位图可以带有8bit的Alpha通道,表示256级别的透明度。 最后,位图数据部分包含了图像实际的像素数据,每个像素的大小由颜色...

    数字图像编程基础.ppt

    2. **图像分类**:图像分为黑白图像(二值图像和灰度图像)以及彩色图像(如16色、256色、16bit、24bit真彩色、32bit RGBA)。彩色图像通常使用RGB、CMYK或HIS模式来表示颜色。 3. **BMP文件结构**:BMP文件由四个...

    raw格式转换为bmp格式(包括代码,lena.raw和lena.bmp)

    在这个项目中,使用了C++语言编写了一个名为`raw2bmp.cpp`的程序,该程序可以读取RAW格式的图像数据,并将其转化为BMP文件。C++是一种强大的系统级编程语言,适合处理这种底层的数据操作。 描述中提到的"lena.raw和...

    BMP转二进制代码工具

    标题中的“BMP转二进制代码工具”指的是一个软件应用,它的主要功能是将BMP(Bitmap)图像文件转化为二进制数据,并且能够以C语言代码的形式表示出来。BMP是一种常见的位图文件格式,广泛应用于Windows操作系统中,...

    图像格式转换.rar

    RAW10和RAW8的区别在于位深度,RAW10提供了更高的色彩精度,通常为10位,而RAW8是8位,意味着RAW10能记录更多的颜色层次。 2. **MIPIRaw10**: - MIPI(Mobile Industry Processor Interface)是一种高速、低功耗...

    photoshop必知

    - 24bit:可以显示超过1600万种颜色。 #### 五、位图图像原理 - **位图图像**由像素组成,每个像素有不同的颜色和亮度值。影响位图图像质量的关键因素之一是分辨率,包括图像分辨率、显示分辨率、打印分辨率、扫描...

    信息技术学业水平考试题(带答案).doc

    - 黑白色是单色图像,65536色为16位图像,800*600 16bit图像的色彩也比24bit少。 7. 数据录入工具 - 输入大百科全书中信息到计算机,可能需要扫描仪将印刷文本转化为数字格式。 8. 大文件下载 - 更高效的下载...

    Bitmap 性能和原理研究.docx

    Bitmap 的原理是将 bits 分组,每组 31bit,然后对每组进行编码,编码后的长度为 32bit。这种方法可以高效地压缩数据,大大减少存储空间。 WAH(Word Aligned Hybrid)算法 WAH 算法是 Bitmap 的一种改进算法,它...

Global site tag (gtag.js) - Google Analytics