public static Image loadFromStream(@NotNull final InputStream inputStream, final int scale) { if (scale <= 0) throw new IllegalArgumentException("Scale must 1 or more"); try { BufferExposingByteArrayOutputStream outputStream = new BufferExposingByteArrayOutputStream(); try { byte[] buffer = new byte[1024]; while (true) { final int n = inputStream.read(buffer); if (n < 0) break; outputStream.write(buffer, 0, n); } } finally { inputStream.close(); } Image image = Toolkit.getDefaultToolkit() .createImage(outputStream.getInternalBuffer(), 0, outputStream.size()); waitForImage(image); if (UIUtil.isRetina() && scale > 1) { image = RetinaImage.createFrom(image, scale, ourComponent); } return image; } catch (Exception ex) { LOG.error(ex); } return null; }
public static Icon scale(@NotNull final Icon source, double _scale) { final int hiDPIscale; if (source instanceof ImageIcon) { Image image = ((ImageIcon) source).getImage(); hiDPIscale = RetinaImage.isAppleHiDPIScaledImage(image) || image instanceof JBHiDPIScaledImage ? 2 : 1; } else { hiDPIscale = 1; } final double scale = Math.min(32, Math.max(.1, _scale)); return new Icon() { @Override public void paintIcon(Component c, Graphics g, int x, int y) { Graphics2D g2d = (Graphics2D) g.create(); try { g2d.translate(x, y); AffineTransform transform = AffineTransform.getScaleInstance(scale, scale); transform.preConcatenate(g2d.getTransform()); g2d.setTransform(transform); g2d.setRenderingHint( RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); source.paintIcon(c, g2d, 0, 0); } finally { g2d.dispose(); } } @Override public int getIconWidth() { return (int) (source.getIconWidth() * scale) / hiDPIscale; } @Override public int getIconHeight() { return (int) (source.getIconHeight() * scale) / hiDPIscale; } }; }