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