1 /******************************************************************************* 2 * Copyright 2011 See AUTHORS file. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 ******************************************************************************/ 16 package com.badlogic.gdx.tools.flame; 17 18 import java.awt.EventQueue; 19 import java.awt.FileDialog; 20 import java.awt.event.ActionEvent; 21 import java.awt.event.ActionListener; 22 import java.awt.event.WindowAdapter; 23 import java.awt.event.WindowEvent; 24 import java.awt.image.BufferedImage; 25 import java.awt.image.WritableRaster; 26 import java.io.File; 27 import java.io.IOException; 28 29 import javax.imageio.ImageIO; 30 import javax.swing.JFrame; 31 import javax.swing.JMenu; 32 import javax.swing.JMenuBar; 33 import javax.swing.JMenuItem; 34 import javax.swing.JOptionPane; 35 import javax.swing.UIManager; 36 import javax.swing.UIManager.LookAndFeelInfo; 37 38 /** @author Inferno */ 39 public class PreAlpha extends JFrame { 40 BufferedImage image; 41 ImagePanel imagePanel; 42 String lastDir; 43 PreAlpha()44 public PreAlpha () { 45 super("Premultiply alpha converter"); 46 addWindowListener(new WindowAdapter() { 47 public void windowClosed (WindowEvent event) { 48 System.exit(0); 49 } 50 }); 51 52 initializeComponents(); 53 pack(); 54 setLocationRelativeTo(null); 55 setDefaultCloseOperation(DISPOSE_ON_CLOSE); 56 setVisible(true); 57 } 58 initializeComponents()59 private void initializeComponents () { 60 //Create the menu bar. 61 JMenuBar menuBar = new JMenuBar(); 62 63 //Build the first menu. 64 JMenu menu = new JMenu("File"); 65 menuBar.add(menu); 66 67 //a group of JMenuItems 68 JMenuItem menuItem = new JMenuItem("Open"); 69 menuItem.addActionListener(new ActionListener() { 70 71 @Override 72 public void actionPerformed (ActionEvent arg0) { 73 open(); 74 } 75 }); 76 menu.add(menuItem); 77 78 menuItem = new JMenuItem("Save"); 79 menuItem.addActionListener(new ActionListener() { 80 81 @Override 82 public void actionPerformed (ActionEvent arg0) { 83 save(); 84 } 85 }); 86 menu.add(menuItem); 87 setJMenuBar(menuBar); 88 89 imagePanel = new ImagePanel(); 90 getContentPane().add(imagePanel); 91 } 92 save()93 protected void save () { 94 FileDialog dialog = new FileDialog(this, "Save Image", FileDialog.SAVE); 95 if (lastDir != null) dialog.setDirectory(lastDir); 96 dialog.setVisible(true); 97 final String file = dialog.getFile(); 98 final String dir = dialog.getDirectory(); 99 if (dir == null || file == null || file.trim().length() == 0) return; 100 lastDir = dir; 101 try { 102 generatePremultiplyAlpha(new File(dir, file)); 103 JOptionPane.showMessageDialog(this, "Conversion complete!"); 104 } catch (Exception ex) { 105 JOptionPane.showMessageDialog(this, "Error saving image."); 106 return; 107 } 108 } 109 open()110 protected void open () { 111 FileDialog dialog = new FileDialog(this, "Open Image", FileDialog.LOAD); 112 if (lastDir != null) dialog.setDirectory(lastDir); 113 dialog.setVisible(true); 114 final String file = dialog.getFile(); 115 final String dir = dialog.getDirectory(); 116 if (dir == null || file == null || file.trim().length() == 0) return; 117 lastDir = dir; 118 try { 119 image = ImageIO.read(new File(dir, file)); 120 imagePanel.setImage(image); 121 imagePanel.revalidate(); 122 imagePanel.repaint(); 123 pack(); 124 } catch (Exception ex) { 125 JOptionPane.showMessageDialog(this, "Error opening image."); 126 return; 127 } 128 } 129 generatePremultiplyAlpha(File out)130 private void generatePremultiplyAlpha(File out){ 131 try { 132 BufferedImage outImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB); 133 float[] color = new float[4]; 134 WritableRaster raster = image.getRaster(); 135 WritableRaster outRaster = outImage.getRaster(); 136 for(int x =0, w = image.getWidth(); x< w; ++x) 137 for(int y =0, h = image.getHeight(); y< h; ++y){ 138 raster.getPixel(x, y, color); 139 float alpha = color[3]/255f; 140 for(int i=0;i < 3; ++i) 141 color[i] *= alpha; 142 outRaster.setPixel(x, y, color); 143 } 144 ImageIO.write(outImage, "png", out); 145 } catch (IOException e) { 146 e.printStackTrace(); 147 } 148 } 149 150 main(String[] args)151 public static void main (String[] args) { 152 for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { 153 if ("Nimbus".equals(info.getName())) { 154 try { 155 UIManager.setLookAndFeel(info.getClassName()); 156 } catch (Throwable ignored) { 157 } 158 break; 159 } 160 } 161 EventQueue.invokeLater(new Runnable() { 162 public void run () { 163 new PreAlpha(); 164 } 165 }); 166 } 167 } 168