diff --git a/.gitignore b/.gitignore index 078b81df2854d58eefa804f0f85f8f2d70bd3a07..fed9ea403d44e8302a2ec7bbfb70aa0f49cfed21 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ bin/ .DS_Store *.png *.jpg +*.bmp +*.gif \ No newline at end of file diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/standalone/Example1.java b/xchart-demo/src/main/java/com/xeiam/xchart/standalone/Example1.java index f8a2080df5299cca98f2301d9d6b3e98ba96ec03..e04feb8306fbf529bf098db1d342c0a5be3c67b0 100644 --- a/xchart-demo/src/main/java/com/xeiam/xchart/standalone/Example1.java +++ b/xchart-demo/src/main/java/com/xeiam/xchart/standalone/Example1.java @@ -16,6 +16,7 @@ package com.xeiam.xchart.standalone; import com.xeiam.xchart.BitmapEncoder; +import com.xeiam.xchart.BitmapEncoder.BitmapFormat; import com.xeiam.xchart.Chart; import com.xeiam.xchart.Series; import com.xeiam.xchart.SeriesMarker; @@ -37,9 +38,15 @@ public class Example1 { Series series = chart.addSeries("y(x)", null, yData); series.setMarker(SeriesMarker.CIRCLE); - BitmapEncoder.savePNG(chart, "./Sample_Chart.png"); - BitmapEncoder.savePNGWithDPI(chart, "./Sample_Chart_300_DPI.png", 300); - BitmapEncoder.saveJPG(chart, "./Sample_Chart.jpg", 0.95f); + BitmapEncoder.saveBitmap(chart, "./Sample_Chart", BitmapFormat.PNG); + BitmapEncoder.saveBitmap(chart, "./Sample_Chart", BitmapFormat.JPG); + BitmapEncoder.saveJPGWithQuality(chart, "./Sample_Chart_With_Quality.jpg", 0.95f); + BitmapEncoder.saveBitmap(chart, "./Sample_Chart", BitmapFormat.BMP); + BitmapEncoder.saveBitmap(chart, "./Sample_Chart", BitmapFormat.GIF); + + BitmapEncoder.saveBitmapWithDPI(chart, "./Sample_Chart_300_DPI", BitmapFormat.PNG, 300); + BitmapEncoder.saveBitmapWithDPI(chart, "./Sample_Chart_300_DPI", BitmapFormat.JPG, 300); + BitmapEncoder.saveBitmapWithDPI(chart, "./Sample_Chart_300_DPI", BitmapFormat.GIF, 300); } } diff --git a/xchart/src/main/java/com/xeiam/xchart/BitmapEncoder.java b/xchart/src/main/java/com/xeiam/xchart/BitmapEncoder.java index 84c0736f8b041ebb96097d7f986bff50acfa55cb..09661e273ef457191d3d0e6ff00a5aaa0d2206ad 100644 --- a/xchart/src/main/java/com/xeiam/xchart/BitmapEncoder.java +++ b/xchart/src/main/java/com/xeiam/xchart/BitmapEncoder.java @@ -50,20 +50,24 @@ public final class BitmapEncoder { } + public enum BitmapFormat { + PNG, JPG, BMP, GIF; + } + /** - * Save a Chart as a PNG file + * Save a Chart as an image file * * @param chart * @param fileName + * @param bitmapFormat * @throws IOException */ - public static void savePNG(Chart chart, String fileName) throws IOException { + public static void saveBitmap(Chart chart, String fileName, BitmapFormat bitmapFormat) throws IOException { BufferedImage bufferedImage = getBufferedImage(chart); - // Save chart as PNG - OutputStream out = new FileOutputStream(fileName); - ImageIO.write(bufferedImage, "png", out); + OutputStream out = new FileOutputStream(fileName + "." + bitmapFormat.toString().toLowerCase()); + ImageIO.write(bufferedImage, bitmapFormat.toString().toLowerCase(), out); out.close(); } @@ -75,7 +79,7 @@ public final class BitmapEncoder { * @param DPI * @throws IOException */ - public static void savePNGWithDPI(Chart chart, String fileName, int DPI) throws IOException { + public static void saveBitmapWithDPI(Chart chart, String fileName, BitmapFormat bitmapFormat, int DPI) throws IOException { double scaleFactor = DPI / 72.0; @@ -88,27 +92,26 @@ public final class BitmapEncoder { graphics2D.setTransform(at); chart.paint(graphics2D, chart.getWidth(), chart.getHeight()); - - for (Iterator<ImageWriter> iw = ImageIO.getImageWritersByFormatName("png"); iw.hasNext();) { - ImageWriter writer = iw.next(); + Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName(bitmapFormat.toString().toLowerCase()); + if (writers.hasNext()) { + ImageWriter writer = writers.next(); // instantiate an ImageWriteParam object with default compression options ImageWriteParam iwp = writer.getDefaultWriteParam(); ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB); IIOMetadata metadata = writer.getDefaultImageMetadata(typeSpecifier, iwp); if (metadata.isReadOnly() || !metadata.isStandardMetadataFormatSupported()) { - continue; + throw new IllegalArgumentException("It is not possible to set the DPI on a bitmap with " + bitmapFormat + " format!! Try another format."); } - setDPIforPNG(metadata, DPI); + setDPI(metadata, DPI); - File file = new File(fileName); + File file = new File(fileName + "." + bitmapFormat.toString().toLowerCase()); FileImageOutputStream output = new FileImageOutputStream(file); writer.setOutput(output); IIOImage image = new IIOImage(bufferedImage, null, metadata); writer.write(null, image, iwp); writer.dispose(); - break; } } @@ -119,7 +122,7 @@ public final class BitmapEncoder { * @param DPI * @throws IIOInvalidTreeException */ - private static void setDPIforPNG(IIOMetadata metadata, int DPI) throws IIOInvalidTreeException { + private static void setDPI(IIOMetadata metadata, int DPI) throws IIOInvalidTreeException { // for PNG, it's dots per millimeter double dotsPerMilli = 1.0 * DPI / 10 / 2.54; @@ -149,7 +152,7 @@ public final class BitmapEncoder { * @throws FileNotFoundException * @throws IOException */ - public static void saveJPG(Chart chart, String fileName, float quality) throws FileNotFoundException, IOException { + public static void saveJPGWithQuality(Chart chart, String fileName, float quality) throws FileNotFoundException, IOException { BufferedImage bufferedImage = getBufferedImage(chart); @@ -174,14 +177,14 @@ public final class BitmapEncoder { * @return a byte[] for a given chart, PNG compressed * @throws IOException */ - public static byte[] getPNGBytes(Chart chart) throws IOException { + public static byte[] getBitmapBytes(Chart chart, BitmapFormat bitmapFormat) throws IOException { BufferedImage bufferedImage = getBufferedImage(chart); byte[] imageInBytes = null; ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ImageIO.write(bufferedImage, "png", baos); + ImageIO.write(bufferedImage, bitmapFormat.toString().toLowerCase(), baos); baos.flush(); imageInBytes = baos.toByteArray(); baos.close(); diff --git a/xchart/src/main/java/com/xeiam/xchart/XChartPanel.java b/xchart/src/main/java/com/xeiam/xchart/XChartPanel.java index 8d1d56888675a88721ad125767597c8fb9c21954..adc5a01943c1887913695e36eb83056509a71e52 100644 --- a/xchart/src/main/java/com/xeiam/xchart/XChartPanel.java +++ b/xchart/src/main/java/com/xeiam/xchart/XChartPanel.java @@ -38,6 +38,8 @@ import javax.swing.JPopupMenu; import javax.swing.KeyStroke; import javax.swing.filechooser.FileFilter; +import com.xeiam.xchart.BitmapEncoder.BitmapFormat; + /** * A Swing JPanel that contains a Chart * <p> @@ -111,22 +113,33 @@ public class XChartPanel extends JPanel { JFileChooser fileChooser = new JFileChooser(); fileChooser.addChoosableFileFilter(new JPGSaveFilter()); - fileChooser.addChoosableFileFilter(new PNGSaveFilter()); + FileFilter pngFileFilter = new PNGSaveFilter(); + fileChooser.addChoosableFileFilter(pngFileFilter); + fileChooser.addChoosableFileFilter(new BMPSaveFilter()); + fileChooser.addChoosableFileFilter(new GIFSaveFilter()); fileChooser.setAcceptAllFileFilterUsed(false); + fileChooser.setFileFilter(pngFileFilter); + if (fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) { if (fileChooser.getSelectedFile() != null) { File theFileToSave = fileChooser.getSelectedFile(); try { if (fileChooser.getFileFilter() == null) { - BitmapEncoder.savePNG(chart, theFileToSave.getCanonicalPath().toString()); + BitmapEncoder.saveBitmap(chart, theFileToSave.getCanonicalPath().toString(), BitmapFormat.PNG); } else if (fileChooser.getFileFilter().getDescription().equals("*.jpg,*.JPG")) { - BitmapEncoder.saveJPG(chart, theFileToSave.getCanonicalPath().toString() + ".jpg", 1.0f); + BitmapEncoder.saveJPGWithQuality(chart, theFileToSave.getCanonicalPath().toString() + ".jpg", 1.0f); } else if (fileChooser.getFileFilter().getDescription().equals("*.png,*.PNG")) { - BitmapEncoder.savePNG(chart, theFileToSave.getCanonicalPath().toString() + ".png"); + BitmapEncoder.saveBitmap(chart, theFileToSave.getCanonicalPath().toString(), BitmapFormat.PNG); + } + else if (fileChooser.getFileFilter().getDescription().equals("*.bmp,*.BMP")) { + BitmapEncoder.saveBitmap(chart, theFileToSave.getCanonicalPath().toString(), BitmapFormat.BMP); + } + else if (fileChooser.getFileFilter().getDescription().equals("*.gif,*.GIF")) { + BitmapEncoder.saveBitmap(chart, theFileToSave.getCanonicalPath().toString(), BitmapFormat.GIF); } } catch (IOException e) { e.printStackTrace(); @@ -158,6 +171,50 @@ public class XChartPanel extends JPanel { } + private class BMPSaveFilter extends FileFilter { + + @Override + public boolean accept(File f) { + + if (f.isDirectory()) { + return false; + } + + String s = f.getName(); + + return s.endsWith(".bmp") || s.endsWith(".BMP"); + } + + @Override + public String getDescription() { + + return "*.bmp,*.BMP"; + } + + } + + private class GIFSaveFilter extends FileFilter { + + @Override + public boolean accept(File f) { + + if (f.isDirectory()) { + return false; + } + + String s = f.getName(); + + return s.endsWith(".gif") || s.endsWith(".GIF"); + } + + @Override + public String getDescription() { + + return "*.gif,*.GIF"; + } + + } + private class PNGSaveFilter extends FileFilter { @Override