Improve SVG preview generation
This commit is contained in:
		
							parent
							
								
									61aa595b20
								
							
						
					
					
						commit
						3ac71e9ff1
					
				@ -20,8 +20,10 @@ import com.drew.metadata.Directory;
 | 
			
		||||
import com.drew.metadata.Metadata;
 | 
			
		||||
import com.drew.metadata.Tag;
 | 
			
		||||
import lombok.AccessLevel;
 | 
			
		||||
import lombok.AllArgsConstructor;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.NoArgsConstructor;
 | 
			
		||||
import lombok.With;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.apache.batik.anim.dom.SAXSVGDocumentFactory;
 | 
			
		||||
import org.apache.batik.bridge.BridgeContext;
 | 
			
		||||
@ -121,7 +123,7 @@ public class ImageUtils {
 | 
			
		||||
        image.setHeight(bufferedImage.getHeight());
 | 
			
		||||
 | 
			
		||||
        ProcessedImage preview = new ProcessedImage();
 | 
			
		||||
        int[] thumbnailDimensions = getThumbnailDimensions(image.getWidth(), image.getHeight(), thumbnailMaxDimension);
 | 
			
		||||
        int[] thumbnailDimensions = getThumbnailDimensions(image.getWidth(), image.getHeight(), thumbnailMaxDimension, true);
 | 
			
		||||
        preview.setWidth(thumbnailDimensions[0]);
 | 
			
		||||
        preview.setHeight(thumbnailDimensions[1]);
 | 
			
		||||
 | 
			
		||||
@ -191,8 +193,18 @@ public class ImageUtils {
 | 
			
		||||
        image.setSize(data.length);
 | 
			
		||||
 | 
			
		||||
        PNGTranscoder transcoder = new PNGTranscoder();
 | 
			
		||||
        transcoder.addTranscodingHint(PNGTranscoder.KEY_MAX_WIDTH, (float) thumbnailMaxDimension);
 | 
			
		||||
        transcoder.addTranscodingHint(PNGTranscoder.KEY_MAX_HEIGHT, (float) thumbnailMaxDimension);
 | 
			
		||||
        if (image.getSize() < 10240) { // if SVG is smaller than 10kB (average 250x250 PNG preview size)
 | 
			
		||||
            return withPreviewAsOriginalImage(image);
 | 
			
		||||
        } else if (image.getSize() > 102400 && image.getWidth() != 0) { // considering SVG image detailed after 100kB
 | 
			
		||||
            // increasing preview dimensions
 | 
			
		||||
            thumbnailMaxDimension = 512;
 | 
			
		||||
            int[] thumbnailDimensions = getThumbnailDimensions(image.getWidth(), image.getHeight(), thumbnailMaxDimension, false);
 | 
			
		||||
            transcoder.addTranscodingHint(PNGTranscoder.KEY_WIDTH, (float) thumbnailDimensions[0]);
 | 
			
		||||
            transcoder.addTranscodingHint(PNGTranscoder.KEY_HEIGHT, (float) thumbnailDimensions[1]);
 | 
			
		||||
        } else {
 | 
			
		||||
            transcoder.addTranscodingHint(PNGTranscoder.KEY_MAX_WIDTH, (float) thumbnailMaxDimension);
 | 
			
		||||
            transcoder.addTranscodingHint(PNGTranscoder.KEY_MAX_HEIGHT, (float) thumbnailMaxDimension);
 | 
			
		||||
        }
 | 
			
		||||
        ByteArrayOutputStream out = new ByteArrayOutputStream();
 | 
			
		||||
        transcoder.transcode(new TranscoderInput(new ByteArrayInputStream(data)), new TranscoderOutput(out));
 | 
			
		||||
        byte[] pngThumbnail = out.toByteArray();
 | 
			
		||||
@ -214,18 +226,16 @@ public class ImageUtils {
 | 
			
		||||
        image.setSize(data.length);
 | 
			
		||||
        image.setWidth(0);
 | 
			
		||||
        image.setHeight(0);
 | 
			
		||||
        ProcessedImage preview = new ProcessedImage();
 | 
			
		||||
        preview.setMediaType(mediaType);
 | 
			
		||||
        preview.setData(null);
 | 
			
		||||
        preview.setSize(data.length);
 | 
			
		||||
        preview.setWidth(0);
 | 
			
		||||
        preview.setHeight(0);
 | 
			
		||||
        image.setPreview(preview);
 | 
			
		||||
        return image;
 | 
			
		||||
        return withPreviewAsOriginalImage(image);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static int[] getThumbnailDimensions(int originalWidth, int originalHeight, int maxDimension) {
 | 
			
		||||
        if (originalWidth <= maxDimension && originalHeight <= maxDimension) {
 | 
			
		||||
    public static ProcessedImage withPreviewAsOriginalImage(ProcessedImage originalImage) {
 | 
			
		||||
        originalImage.setPreview(originalImage.withData(null));
 | 
			
		||||
        return originalImage;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static int[] getThumbnailDimensions(int originalWidth, int originalHeight, int maxDimension, boolean originalIfSmaller) {
 | 
			
		||||
        if (originalWidth <= maxDimension && originalHeight <= maxDimension && originalIfSmaller) {
 | 
			
		||||
            return new int[]{originalWidth, originalHeight};
 | 
			
		||||
        }
 | 
			
		||||
        int thumbnailWidth;
 | 
			
		||||
@ -242,10 +252,13 @@ public class ImageUtils {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Data
 | 
			
		||||
    @AllArgsConstructor
 | 
			
		||||
    @NoArgsConstructor
 | 
			
		||||
    public static class ProcessedImage {
 | 
			
		||||
        private String mediaType;
 | 
			
		||||
        private int width;
 | 
			
		||||
        private int height;
 | 
			
		||||
        @With
 | 
			
		||||
        private byte[] data;
 | 
			
		||||
        private long size;
 | 
			
		||||
        private ProcessedImage preview;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user