import java.awt.BasicStroke; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javafx.application.Application; import javafx.geometry.Rectangle2D; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.effect.Blend; import javafx.scene.effect.BlendMode; import javafx.scene.effect.ImageInput; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; import javafx.stage.Stage; import javax.imageio.ImageIO; public class ImageDPITest extends Application { static boolean force; public static void main(String argv[]) { force = argv.length > 0; launch(argv); } @Override public void start(Stage stage) { makeImages(); Image img1 = new Image("image1.png"); Image img2 = new Image("image2.png"); ImageView imgv1 = new ImageView(img1); imgv1.setTranslateX(10); imgv1.setTranslateY(10); ImageView imgv2 = new ImageView(img2); imgv2.setTranslateX(210); imgv2.setTranslateY(10); ImageView imgv3 = new ImageView(img1); imgv3.setViewport(new Rectangle2D(1, 1, 148, 98)); imgv3.setTranslateX(411); imgv3.setTranslateY(11); ImageView imgv4 = new ImageView(img2); imgv4.setViewport(new Rectangle2D(1, 1, 148, 98)); imgv4.setTranslateX(611); imgv4.setTranslateY(11); Rectangle r1 = new Rectangle(10, 160, 150, 100); r1.setFill(Color.rgb(255, 255, 0, 0.25)); r1.setEffect(new Blend(BlendMode.SRC_OVER, null, new ImageInput(img1, 10, 160))); Rectangle r2 = new Rectangle(210, 160, 150, 100); r2.setFill(Color.rgb(255, 255, 0, 0.25)); r2.setEffect(new Blend(BlendMode.SRC_OVER, null, new ImageInput(img2, 210, 160))); Canvas cv = new Canvas(800, 150); cv.setTranslateY(300); GraphicsContext gc = cv.getGraphicsContext2D(); gc.drawImage(img1, 10, 10); gc.drawImage(img2, 210, 10); gc.drawImage(img1, 1, 1, 148, 98, 411, 11, 148, 98); gc.drawImage(img2, 1, 1, 148, 98, 611, 11, 148, 98); Group root = new Group(imgv1, imgv2, imgv3, imgv4, r1, r2, cv); Scene scene = new Scene(root, 800, 450); stage.setScene(scene); stage.show(); } void makeImages() { makeImage("image1.png", "Low", 1); makeImage("image1@2x.png", "High", 2); makeImage("image2.png", "Only", 1); } void makeImage(String filename, String content, int scale) { File f = new File(filename); if (!force && f.exists()) return; int w = 150; int h = 100; BufferedImage bimg = new BufferedImage(w * scale, h * scale, BufferedImage.TYPE_INT_ARGB_PRE); Graphics2D g2d = bimg.createGraphics(); g2d.scale(scale, scale); g2d.setColor(java.awt.Color.RED); g2d.setStroke(new BasicStroke(2)); g2d.drawRect(1, 1, w-2, h-2); g2d.setFont(new java.awt.Font("Serif", Font.BOLD, 64)); g2d.setColor(java.awt.Color.BLUE); g2d.drawString(content, 10, 75); try { ImageIO.write(bimg, "png", f); } catch (IOException e) { System.out.println("error writing: "+filename); } } }