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】即可。
图片是客户私密档案就不贴了。