java-org.hwo/src/org/hwo/image/tiff/TiffFile.java

153 lines
2.8 KiB
Java

package org.hwo.image.tiff;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.lang.reflect.Array;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.ShortBuffer;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import org.hwo.image.ImageFile;
import org.hwo.image.UnsupportedFormatException;
public class TiffFile implements ImageFile {
ByteBuffer sourceBuffer;
boolean bigEndian;
LinkedList<IFD> ifds;
List<BufferedImage> pages;
public TiffFile()
{
reset();
}
@Override
public ImageFile newInstance() {
return new TiffFile();
}
@Override
public void reset() {
bigEndian = false;
ifds = new LinkedList<IFD>();
pages = new LinkedList<BufferedImage>();
sourceBuffer = null;
}
@Override
public void load(File imageFile) {
if (!identify(imageFile))
throw new UnsupportedFormatException();
Integer firstIFD = sourceBuffer.getInt(0x0004);
sourceBuffer.position(firstIFD);
ifds.add(0, new IFD(this));
reorderPages();
}
private void reorderPages()
{
System.err.println("Testing Page Order");
if (ifds.size() == 0) // Keine Seiten vorhanden
return;
if (ifds.get(0).getPageNumber() == -1) // Keine Seitenzahlen angegeben
return;
System.err.println("Reorder...");
IFD[] ifdsOrdered = new IFD[ ifds.size() ];
for (int n=0; n<ifdsOrdered.length; n++)
ifdsOrdered[ ifds.get(n).getPageNumber() ] = ifds.get(n);
ifds.clear();
ifds.addAll(Arrays.asList(ifdsOrdered));
}
@Override
public void save(File imageFile) {
}
@Override
public Integer getNumPages() {
return ifds.size();
}
@Override
public BufferedImage getPage(Integer pageNo) {
if (pageNo < ifds.size())
{
return ifds.get(pageNo).getBufferedImage();
}
return null;
}
@Override
public void addPage(BufferedImage image) {
ifds.add(new IFD(this, image));
}
@Override
public Boolean identify(File imageFile) {
reset();
if (!imageFile.exists())
if (imageFile.getName().endsWith(".tiff"))
return true;
else
return false;
byte[] buffer = new byte[ (int)imageFile.length() ];
try
{
FileInputStream input = new FileInputStream(imageFile);
input.read(buffer);
input.close();
sourceBuffer = ByteBuffer.wrap(buffer);
if (sourceBuffer.getShort(0) == 0x4D4D)
bigEndian = true;
else if (sourceBuffer.getShort(0) == 0x4949)
bigEndian = false;
else
return false;
if (bigEndian)
sourceBuffer.order(ByteOrder.BIG_ENDIAN);
else
sourceBuffer.order(ByteOrder.LITTLE_ENDIAN);
if (sourceBuffer.getShort(0x0002) != 42)
return false;
} catch (Exception e)
{
e.printStackTrace();
return false;
}
return true;
}
}