forked from LupusNobilis/java-org.hwo
153 lines
2.8 KiB
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;
|
|
}
|
|
|
|
|
|
}
|