package jirau; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import javax.imageio.ImageIO; import de.uni_siegen.wineme.come_in.thumbnailer.thumbnailers.AbstractThumbnailer; import de.uni_siegen.wineme.come_in.thumbnailer.util.IOUtil; import de.uni_siegen.wineme.come_in.thumbnailer.util.ResizeImage; public class DWGThumbnailer extends AbstractThumbnailer { public void generateThumbnail(File input, File output) throws IOException, de.uni_siegen.wineme.come_in.thumbnailer.ThumbnailerException { //GENERATE FROM EXISTING BITMAP IN DWG byte[] outputByte = new byte[4096]; FileInputStream fis = null; try { fis = new FileInputStream(input); fis.skip(0x0D); fis.read(outputByte, 0, 4); int PosSentinel = (((outputByte[3])&0xFF)*256*256*256)+(((outputByte[2])&0xFF)*256*256)+(((outputByte[1])&0xFF)*256)+((outputByte[0])&0xFF); fis.skip(PosSentinel-0x0D-4+30); outputByte[1]=0; fis.read(outputByte, 0, 1); int TypePreview = ((outputByte[0])&0xFF); if (TypePreview==2) { fis.read(outputByte, 0, 4); int PosBMP = (((outputByte[3])&0xFF)*256*256*256)+(((outputByte[2])&0xFF)*256*256)+(((outputByte[1])&0xFF)*256)+((outputByte[0])&0xFF); fis.read(outputByte, 0, 4); int LenBMP = (((outputByte[3])&0xFF)*256*256*256)+(((outputByte[2])&0xFF)*256*256)+(((outputByte[1])&0xFF)*256)+((outputByte[0])&0xFF); fis.skip(PosBMP-(PosSentinel+30)-1-4-4+14); fis.read(outputByte, 0, 2); int biBitCount = (((outputByte[1])&0xFF)*256)+((outputByte[0])&0xFF); fis.skip(-16); int bisSize=0; int bfSize = 0; if (biBitCount<9) bfSize = 54 + 4 * ((int) (Math.pow(2,biBitCount))) + LenBMP ; else bfSize = 54 + LenBMP ; //WORD "BM" outputByte[0]=0x42;outputByte[1]=0x4D; //DWORD bfSize outputByte[2]=(byte)(bfSize&0xff);outputByte[3]=(byte)(bfSize>>8&0xff); outputByte[4]=(byte)(bfSize>>16&0xff);outputByte[5]=(byte)(bfSize>>>24); //WORD bfReserved1 outputByte[6]=0x00;outputByte[7]=0x00; //WORD bfReserved2 outputByte[8]=0x00;outputByte[9]=0x00; //DWORD bfOffBits outputByte[10]=0x36;outputByte[11]=0x04;outputByte[12]=0x00;outputByte[13]=0x00; ByteArrayOutputStream baos = new ByteArrayOutputStream(); baos.write(outputByte,0,14); while((LenBMP>0) && ((bisSize=fis.read(outputByte, 0, (LenBMP>4096?4096:LenBMP))) != -1)) { baos.write(outputByte, 0, bisSize); LenBMP-=bisSize; } ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); BufferedImage originalImage = ImageIO.read(bais); ResizeImage resizer = new ResizeImage(thumbWidth, thumbHeight); resizer.setInputImage(originalImage); resizer.writeOutput(output); } } finally { IOUtil.quietlyClose(fis); } } public String[] getAcceptedMIMETypes() { return new String[]{ "image/x-dwg" }; } }