Search in sources :

Example 1 with ImageReadException

use of org.apache.sanselan.ImageReadException in project intellij-community by JetBrains.

the class IfsUtil method refresh.

/**
   * Load image data for file and put user data attributes into file.
   *
   * @param file File
   * @return true if file image is loaded.
   * @throws java.io.IOException if image can not be loaded
   */
private static boolean refresh(@NotNull VirtualFile file) throws IOException {
    Long loadedTimeStamp = file.getUserData(TIMESTAMP_KEY);
    SoftReference<BufferedImage> imageRef = file.getUserData(BUFFERED_IMAGE_REF_KEY);
    if (loadedTimeStamp == null || loadedTimeStamp.longValue() != file.getTimeStamp() || SoftReference.dereference(imageRef) == null) {
        try {
            final byte[] content = file.contentsToByteArray();
            if (ICO_FORMAT.equalsIgnoreCase(file.getExtension())) {
                try {
                    final BufferedImage image = ICO_IMAGE_PARSER.getBufferedImage(new ByteSourceArray(content), null);
                    file.putUserData(FORMAT_KEY, ICO_FORMAT);
                    file.putUserData(BUFFERED_IMAGE_REF_KEY, new SoftReference<>(image));
                    return true;
                } catch (ImageReadException ignore) {
                }
            }
            InputStream inputStream = new ByteArrayInputStream(content, 0, content.length);
            ImageInputStream imageInputStream = ImageIO.createImageInputStream(inputStream);
            try {
                Iterator<ImageReader> imageReaders = ImageIO.getImageReaders(imageInputStream);
                if (imageReaders.hasNext()) {
                    ImageReader imageReader = imageReaders.next();
                    try {
                        file.putUserData(FORMAT_KEY, imageReader.getFormatName());
                        ImageReadParam param = imageReader.getDefaultReadParam();
                        imageReader.setInput(imageInputStream, true, true);
                        int minIndex = imageReader.getMinIndex();
                        BufferedImage image = imageReader.read(minIndex, param);
                        file.putUserData(BUFFERED_IMAGE_REF_KEY, new SoftReference<>(image));
                        return true;
                    } finally {
                        imageReader.dispose();
                    }
                }
            } finally {
                imageInputStream.close();
            }
        } finally {
            // We perform loading no more needed
            file.putUserData(TIMESTAMP_KEY, file.getTimeStamp());
        }
    }
    return false;
}
Also used : ImageInputStream(javax.imageio.stream.ImageInputStream) ByteArrayInputStream(java.io.ByteArrayInputStream) InputStream(java.io.InputStream) ByteSourceArray(org.apache.sanselan.common.byteSources.ByteSourceArray) ImageInputStream(javax.imageio.stream.ImageInputStream) BufferedImage(java.awt.image.BufferedImage) ImageReadParam(javax.imageio.ImageReadParam) ByteArrayInputStream(java.io.ByteArrayInputStream) ImageReadException(org.apache.sanselan.ImageReadException) ImageReader(javax.imageio.ImageReader)

Aggregations

BufferedImage (java.awt.image.BufferedImage)1 ByteArrayInputStream (java.io.ByteArrayInputStream)1 InputStream (java.io.InputStream)1 ImageReadParam (javax.imageio.ImageReadParam)1 ImageReader (javax.imageio.ImageReader)1 ImageInputStream (javax.imageio.stream.ImageInputStream)1 ImageReadException (org.apache.sanselan.ImageReadException)1 ByteSourceArray (org.apache.sanselan.common.byteSources.ByteSourceArray)1