2009-10-18 5 views
0

Я создаю простой апплет для создания аватаров. Вы можете выбрать лицо, волосы, глаза и т. Д., А затем сохранить его на диск в виде файла png. Простая версия (без интерфейса для цели простоты) выглядит так:Java-апплет - сохранение изображения в формате png

import java.awt.*; 
import java.applet.*; 
import java.net.*; 

public class Example extends Applet 
{ 

Image my_gif; 
Image my_gif2; 
URL base; 
MediaTracker mt; 

public void init() 
{ 
     mt = new MediaTracker(this); 
    try { 
      base = getDocumentBase(); 
    } 
    catch (Exception e) {} 

     my_gif = getImage(base,"1.gif"); 
     my_gif2 = getImage(base,"2.gif"); 

     mt.addImage(my_gif,1); 
     mt.addImage(my_gif2,2); 

     try { 
      mt.waitForAll(); 
     } 
     catch (InterruptedException e) {} 
    } 
public void paint(Graphics g) 
{ 
     g.drawImage(my_gif,0,0,this); 
    g.drawImage(my_gif2,0,0,this); 
} 
} 

Этот пример состоит из двух файлов. При запуске они отображаются корректно. Теперь я хотел бы сохранить его на диске - я могу сохранить одно изображение с помощью BufferedImage, но я хочу «сгладить» два или более изображения и сохранить его. Любая помощь будет принята с благодарностью. Я также согласен с тем, что, возможно, мой подход не является правильным и был бы благодарен за любые исправления.

ответ

2

Остерегайтесь быстро написанного и непроверенного кода!

Основная идея заключается в следующем: Вы загружаете изображения, из которых вы объединяете аватар, затем создаете новое пустое изображение и рисуете на нем каждую часть аватара. После этого вы просто сохраняете только что созданное изображение в файл.

Важное примечание. Метод getPath() не будет работать для неподписанных апплетов, вызванных AccessViolation. Я полагаю, что FileChooser будет лучшим подходом здесь.

import java.awt.Graphics2D; 
import java.awt.GraphicsConfiguration; 
import java.awt.GraphicsEnvironment; 
import java.awt.Transparency; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.net.URISyntaxException; 
import java.net.URL; 
import javax.imageio.ImageIO; 

public class Avatar { 
    // Graphics 
    private GraphicsConfiguration config = GraphicsEnvironment 
      .getLocalGraphicsEnvironment().getDefaultScreenDevice() 
      .getDefaultConfiguration(); 

    private BufferedImage faceImage; 
    private BufferedImage hairImage; 
    private BufferedImage mouthImage; 

    public Avatar(final String face, final String hair, final String mouth, 
      final String out) { 

     // Load the Image parts 
     faceImage = load(face); 
     hairImage = load(hair); 
     mouthImage = load(mouth); 

     // Combine the images 
     BufferedImage outImage = combine(); 

     // Save the new image 
     try { 
      ImageIO.write(outImage, "png", new File(getPath() 
        + "screenshot.png")); 
     } catch (IOException e) { 
     } 
    } 

    // Combine 
    private BufferedImage combine() { 
     // Create an empty image 
     BufferedImage buffer = create(200, 400, true); 

     // Get the graphics context 
     Graphics2D g = buffer.createGraphics(); 

     // Draw all 3 images onto the empty one 
     g.drawImage(faceImage, 0, 0, null); 
     g.drawImage(hairImage, 0, 0, null); 
     g.drawImage(mouthImage, 0, 0, null); 

     // Get rid of the graphics context 
     g.dispose(); 
     return buffer; 
    } 

    // Image 
    private URL getURL(final String filename) { 
     URL url = Avatar.class.getResource(filename); 
     return url; 
    } 

    private BufferedImage load(final String file) { 
     URL filename = getURL(file); 
     if (filename == null) { 
      return null; 
     } else { 
      try { 
       return ImageIO.read(filename); 
      } catch (IOException e) { 
       return null; 
      } 
     } 
    } 

    private BufferedImage create(final int width, final int height, 
      final boolean alpha) { 
     BufferedImage buffer = config.createCompatibleImage(width, height, 
       alpha ? Transparency.TRANSLUCENT : Transparency.OPAQUE); 
     return buffer; 
    } 

    // Path 
    private final String getPath() { 
     String path = currentPath(); 
     if (currentPath().toLowerCase().endsWith(".jar")) { 
      path = path.substring(0, path.lastIndexOf("/") + 1); 
     } 
     return path; 

    } 

    private String currentPath() { 
     try { 
      return this.getClass().getProtectionDomain().getCodeSource() 
        .getLocation().toURI().getPath(); 
     } catch (URISyntaxException e) { 
      return ""; 
     } 
    } 
} 
+0

Спасибо большое! Отлично работает. – nupek

+0

Подписывается ли апплет? Если сохранение результата является единственной причиной, по которой вам нужно запускать как подписанный апплет, вы можете иметь апплет POST с байтами изображения [] на сервере, а затем перенаправить браузер для загрузки полученного изображения PNG. –

0

здесь код, который поможет U для редактирования изображений

Hope it helps you 

/*Arpana*/ 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Container; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridLayout; 
import java.awt.Image; 
import java.awt.MediaTracker; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.awt.image.BufferedImage; 
import java.awt.image.ConvolveOp; 
import java.awt.image.Kernel; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.border.TitledBorder; 

public class ConvolveApp extends JFrame { 
    CPanel displayPanel; 

    JButton sharpenButton, blurringButton, edButton, resetButton; 

    public ConvolveApp() { 
    super(); 
    Container container = getContentPane(); 

    displayPanel = new CPanel(); 
    container.add(displayPanel); 

    JPanel panel = new JPanel(); 
    panel.setLayout(new GridLayout(2, 2)); 
    panel 
     .setBorder(new TitledBorder(
      "Click a Button to Perform the Associated Operation and Reset...")); 

    sharpenButton = new JButton("Sharpen"); 
    sharpenButton.addActionListener(new ButtonListener()); 
    blurringButton = new JButton("Blur"); 
    blurringButton.addActionListener(new ButtonListener()); 
    edButton = new JButton("Edge Detect"); 
    edButton.addActionListener(new ButtonListener()); 
    resetButton = new JButton("Reset"); 
    resetButton.addActionListener(new ButtonListener()); 

    panel.add(sharpenButton); 
    panel.add(blurringButton); 
    panel.add(edButton); 
    panel.add(resetButton); 

    container.add(BorderLayout.SOUTH, panel); 

    addWindowListener(new WindowAdapter() { 
     public void windowClosing(WindowEvent e) { 
     System.exit(0); 
     } 
    }); 
    //setSize(100,100); 
    setSize(displayPanel.getWidth()+50, displayPanel.getHeight()); 
    setVisible(true); 
    } 
    public static void main(String arg[]) { 
    new ConvolveApp(); 
    } 

    class ButtonListener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     JButton button = (JButton) e.getSource(); 

     if (button.equals(sharpenButton)) { 
     displayPanel.sharpen(); 
     displayPanel.repaint(); 
     } else if (button.equals(blurringButton)) { 
     displayPanel.blur(); 
     displayPanel.repaint(); 
     } else if (button.equals(edButton)) { 
     displayPanel.edgeDetect(); 
     displayPanel.repaint(); 
     } else if (button.equals(resetButton)) { 
     displayPanel.reset(); 
     displayPanel.repaint(); 
     } 
    } 
    } 
} 

class CPanel extends JLabel { 
    Image displayImage; 

    BufferedImage biSrc; 

    BufferedImage biDest; // Destination image is mandetory. 

    BufferedImage bi; // Only an additional reference. 

    Graphics2D big; 

    CPanel() { 
    setBackground(Color.black); 
    loadImage(); 
    setSize(displayImage.getWidth(this), displayImage.getWidth(this)); 
    createBufferedImages(); 
    bi = biSrc; 
    } 

    public void loadImage() { 
    displayImage = Toolkit.getDefaultToolkit().getImage("Desert.jpg"); 
    MediaTracker mt = new MediaTracker(this); 
    mt.addImage(displayImage, 1); 
    try { 
     mt.waitForAll(); 
    } catch (Exception e) { 
     System.out.println("Exception while loading."); 
    } 
    if (displayImage.getWidth(this) == -1) { 
     System.out.println("No jpg file"); 
     System.exit(0); 
    } 
    } 

    public void createBufferedImages() { 
    biSrc = new BufferedImage(displayImage.getWidth(this), displayImage 
     .getHeight(this), BufferedImage.TYPE_INT_RGB); 

    big = biSrc.createGraphics(); 
    big.drawImage(displayImage, 0, 0, this); 

    biDest = new BufferedImage(displayImage.getWidth(this), displayImage 
     .getHeight(this), BufferedImage.TYPE_INT_RGB); 
    } 

    public void sharpen() { 
    float data[] = { -1.0f, -1.0f, -1.0f, -1.0f, 9.0f, -1.0f, -1.0f, -1.0f, 
     -1.0f }; 
    Kernel kernel = new Kernel(3, 3, data); 
    ConvolveOp convolve = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, 
     null); 
    convolve.filter(biSrc, biDest); 
    bi = biDest; 
    } 

    public void blur() { 
    float data[] = { 0.0625f, 0.125f, 0.0625f, 0.125f, 0.25f, 0.125f, 
     0.0625f, 0.125f, 0.0625f }; 
    Kernel kernel = new Kernel(3, 3, data); 
    ConvolveOp convolve = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, 
     null); 
    convolve.filter(biSrc, biDest); 
    bi = biDest; 
    } 

    public void edgeDetect() { 
    float data[] = { 1.0f, 0.0f, -1.0f, 1.0f, 0.0f, -1.0f, 1.0f, 0.0f, 
     -1.0f }; 

    Kernel kernel = new Kernel(3, 3, data); 
    ConvolveOp convolve = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, 
     null); 
    convolve.filter(biSrc, biDest); 

    bi = biDest; 
    } 

    public void reset() { 
    big.setColor(Color.black); 
    big.clearRect(0, 0, bi.getWidth(this), bi.getHeight(this)); 
    big.drawImage(displayImage, 0, 0, this); 
    bi = biSrc; 
    } 

    public void update(Graphics g) { 
    g.clearRect(0, 0, getWidth(), getHeight()); 
    paintComponent(g); 
    } 

    public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2D = (Graphics2D) g; 

    g2D.drawImage(bi, 0, 0, this); 
    } 
} 
Смежные вопросы