Skip to content

AutoCad DWG thumbnail #9

Description

@rodrigodeppe

Hello,
I've been using this lib for quite a while now. Congratulations on the good job done.

Recently I had to generate thumbs from AutoCad DWG files. I found out that a BMP preview is stored within the file and created a DWGThumbnailer that can be registered on your lib. Thought you would like to have a copy. Of course if you find any room for improvement on the code, feel free to do it.
Best regards,
Rodrigo Deppe

Here is the code:

public class DWGThumbnailer extends DummyThumbnailer {

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 = 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());

        try {
            BufferedImage originalImage = ImageIO.read(bais);
            float scaleWidth = ((float) this.thumbWidth) / originalImage.getWidth();
            float scaleHeight = ((float) this.thumbHeight) / originalImage.getHeight();
            int newWidth = this.thumbWidth;
            int newHeight = this.thumbHeight;
            //PRESERVE ASPECT RATIO
            if (scaleWidth<scaleHeight)
                newHeight=Math.round(newHeight*scaleWidth);
            else newWidth=Math.round(newWidth*scaleHeight);
            BufferedImage newImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
            Graphics g = newImage.createGraphics();
            g.drawImage(originalImage, 0, 0, newWidth, newHeight, null);
            g.dispose();

            ImageIO.write(newImage,"jpg",output);
        } catch (Exception e) {
            //STILL TO DO: support 32bit bitmap rescaling
            bais.reset();
            FileOutputStream fos = new FileOutputStream(output);
            while ((bisSize=bais.read(outputByte, 0, 4096)) != -1) 
                fos.write(outputByte, 0, bisSize);
            fos.close();
        }
    }
    fis.close();
}

public String[] getAcceptedMIMETypes() {
    String dwgMIME = "image/x-dwg" ;
    Collection dwgMIMEColl = new ArrayList();
    dwgMIMEColl.add(dwgMIME) ;
    return (String[]) dwgMIMEColl.toArray(new String[dwgMIMEColl.size()]);
}

}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions