关于老旧格式的tiff转换tpg

tiff转换jpg网上有很多。比如

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import java.awt.Color;
import java.awt.image.ColorModel;

import javax.media.jai.JAI;
import javax.media.jai.RenderedOp;

public class imgUpdateTest {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		// Define the source and destination file names.
		String inputFile = "E://28752490001.tif";
		String outputFile = "E://Rb.jpg";

		// Load the input image.
		RenderedOp src = JAI.create("fileload", inputFile);

		// Encode the file as a JPEG image.
		FileOutputStream stream =
		new FileOutputStream(outputFile);
		JAI.create("encode", src, stream, "JPEG", null);

		// Store the image in the BMP format.
		JAI.create("filestore", src, outputFile,"JPEG", null);
	}
       
}

这是我在网上找到的。但是有些老旧格式的tiff转换会报错:Decoding of old style JPEG-in-TIFF data is not supported。于是又去找- -。

后来在https://community.oracle.com/thread/1281381找到解决方案。

他觉得是部分tiff的文件头部分不符合格式。于是就跳过在读取修改。方案如下:

/**
 * @(#)extrairJPEGinTIFF.java
 *
 *
 * @author Vinicius Alves das Neves  e-mail:viniciusba@gmail.com
 * @version 1.00 2007/3/8
 */
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Vector;
import java.awt.Point;

public class extrairJPEGinTIFF {
     
    private FileInputStream imgTIFF=null;
    private byte[] bytesTIFF=null;
    private int qdeImagens=0;
    private Vector pontosIMG=null;
    private boolean FileExiste=false;     
         
    public extrairJPEGinTIFF() {
     
    }
    
/************************************************************************/    
    public boolean setArqTIFF(String file){
      try{
           
           imgTIFF = new FileInputStream(file);
         int tam=imgTIFF.available();
         System.out.println(tam);
         bytesTIFF=new byte[tam];
         imgTIFF.read(bytesTIFF,0,tam);
  
      }catch(IOException erro){
           System.out.println(erro.toString());
      }
      pontosIMG=new Vector();
      FileExiste=getPosicaoJPEG();
      return FileExiste;
    }
    
/************************************************************************/    
  public boolean isExisteJPEG(){
       return FileExiste;
  }    
    
/************************************************************************/    
    private boolean getPosicaoJPEG(){
         
         int inicio=0;int fim=0;String ant="";
         Vector imgsPontos=new Vector();
         
         for(int i=0;i<bytesTIFF.length;i++){     
           
          String atual=paraStringHexaByte(bytesTIFF); 

     atual=atual.toUpperCase();

     

     /**

     * Buscando cabe�alhos de inicio e fim de uma imagem JFIF/JPEG

     * Inicio: FF D8 FF E0...

     * Fim: FF D9

     */

//Cabe�alho de inicio de imagem

     if(ant.equals("FF") && atual.equals("D8")){

          

          String pos1=paraStringHexaByte(bytesTIFF[i+1]).toUpperCase();

          String pos2=paraStringHexaByte(bytesTIFF[i+2]).toUpperCase();

          

          if(pos1.equals("FF") && pos2.equals("E0") )

          {   

               System.out.println(pos1+"-"+pos2);

               inicio=i-1;ant=null;

          }

          else ant=null;

     }//Cabe�alho de fim de imagem

     else if(inicio!=0 && ant.equals("FF") && atual.equals("D9")){ 

          

          fim=i-1;ant=null;

          

          }

     //--------------------------------------------------------------------     

     

     ant=atual;

     

     //Valida marcadores de inicio e fim de uma imagem JFIF/JPEG     

     if(inicio!=0 && fim!=0){

          imgsPontos.add(new Point(inicio,fim));

          inicio=0;fim=0;ant="";atual="";

     };

     

     }//Fim for(int i=0;i<bytesTIFF.length;i++)

     

     //Verifica se encontrou alguma imagem

     if(imgsPontos.size()>0){ 

          pontosIMG=imgsPontos;

          return true;

} else return false;

     

}



/************************************************************************/ 

private String paraStringHexaByte(byte bytes) {

StringBuilder s = new StringBuilder();



int parteAlta = ((bytes >> 4) & 0xf) << 4;

int parteBaixa = bytes & 0xf;

if (parteAlta == 0) s.append('0');



String strHex=Integer.toHexString(parteAlta | parteBaixa);

s.append(strHex);



return s.toString();

}



/************************************************************************/ 

     private byte[] getJPEGinTIFF(byte[] imgBytes,int setI,int setF){

     ByteArrayOutputStream bytesExtraidos=null;

try{       

          bytesExtraidos = new ByteArrayOutputStream();

          bytesExtraidos.write(imgBytes,setI,setF-setI);

     }catch(Exception e){System.out.println(e.toString());}

     

     return bytesExtraidos.toByteArray();

}



/************************************************************************/ 

public byte[] getJPEG(int numPagina){

     

if(numPagina>=0 && pontosIMG.size()>0){

byte[] temp=getJPEGinTIFF(bytesTIFF,

                    ((Point)pontosIMG.elementAt(numPagina)).x,

                    ((Point)pontosIMG.elementAt(numPagina)).y

     );

return temp;     

}else return null;



}



/************************************************************************/ 

public void salvarJPEG(int numPagina){

     try{

     

     FileOutputStream saida=new FileOutputStream("saida"+numPagina+".jpg");

     saida.write(getJPEG(numPagina));

     saida.close();

     

     }catch(IOException e){System.out.println(e.toString());}

     

} 



/************************************************************************/ 

private int getQdeImagens(){

     return pontosIMG.size();

}

/************************************************************************/ 



public static void main(String args[]){

     

extrairJPEGinTIFF teste =new extrairJPEGinTIFF();

boolean result=teste.setArqTIFF(args[0]);

System.out.println(teste.getQdeImagens());

if(result==true) teste.salvarJPEG(0);



}



} 

其中
 String atual=paraStringHexaByte(bytesTIFF); 
作者好像贴错了。给
bytesTIFF
后面加上【i】即可。

图片是客户私密档案就不贴了。



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值