在Applet中将图像保存到文件?

3
所以事情是这样的,我正在尝试为一款网络游戏创建一个小程序来制作“定制”头像。这些头像是为了代表一个国家的军队,因此头像由用户选择的图像和代表用户所属分组的边框组成。
我的计划是让用户从计算机中选择文件,然后选择他们所属的分组。之后,他们将看到图片预览,并可以将其保存到计算机上以便在游戏中使用。
我知道可以使用Graphic或Graphic2D在组件的背景上绘制图像,但当我想将其保存到文件时,该怎么做呢?
5个回答

3
数字代码签名对于使用插件2(PI2 - 1.6.0_10+)架构JRE部署的小程序并不是必需的。在PI2 JRE中,嵌入式小程序可以访问通常只能用于Java Web Start应用程序的所有服务。
这个小程序感兴趣的服务是FileOpenService(FOS)和PersistenceService(PS)。 FOS可用于允许用户导航到一个文件(或者更准确地说是FileContents对象)并从中获取流。一旦用户对裁剪后的图像满意,就将其保存到PS以供以后检索(如先前提到的使用ImageIO)。

3
使用JFileChooser#showSaveDialog()让用户选择/指定要保存的文件,然后使用ImageIO#write()BufferedImage写入文件中。请注意保留HTML标记。
JFileChooser fileChooser = new JFileChooser();
if (fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
    ImageIO.write(bufferedImage, "JPEG", fileChooser.getSelectedFile());
} else {
    // User pressed cancel.
}

该小程序需要签名才能避免最终用户被安全警告吓到。

这在未签名的小程序中是行不通的。除非已签名,否则SecurityManager将防止本地文件系统修改。但如果已签名,则是有效的。 - Chris Dennett
@Chris:如果小程序已经签名或者最终用户已经接受了在加载小程序之前显示的安全警告,则它可以完美地运行。 - BalusC
哎呀,我没意识到,抱歉。不过对于最终用户来说,这有点可怕。 - Chris Dennett
@Chris:无论他们在做什么,所有未签名的小程序都会显示警告。 - BalusC

1

以下是记事本代码,您可以保存其中的内容,也可以将文本转换为图像。请尝试阅读。

/*Arpana*/

mport javax.swing.*;

import java.awt.*;

import java.awt.event.*;

import java.util.Scanner;

import java.io.*;



public class Notepad extends JFrame implements ActionListener {

    private TextArea textArea = new TextArea("", 0,0, TextArea.SCROLLBARS_VERTICAL_ONLY);

    private MenuBar menuBar = new MenuBar(); // first, create a MenuBar item

    private Menu file = new Menu(); // our File menu

    // what's going in File? let's see...

    private MenuItem openFile = new MenuItem();  // an open option

    private MenuItem saveFile = new MenuItem(); // a save option

    private MenuItem close = new MenuItem(); // and a close option!



    public Notepad() {

        this.setSize(500, 300); // set the initial size of the window

       this.setTitle("Java Notepad Tutorial"); // set the title of the window

        setDefaultCloseOperation(EXIT_ON_CLOSE); // set the default close operation (exit when it gets closed)

        this.textArea.setFont(new Font("Century Gothic", Font.BOLD, 12)); // set a default font for the TextArea

        // this is why we didn't have to worry about the size of the TextArea!

        this.getContentPane().setLayout(new BorderLayout()); // the BorderLayout bit makes it fill it automatically

        this.getContentPane().add(textArea);



        // add our menu bar into the GUI

        this.setMenuBar(this.menuBar);

        this.menuBar.add(this.file); // we'll configure this later



        // first off, the design of the menuBar itself. Pretty simple, all we need to do

       // is add a couple of menus, which will be populated later on

        this.file.setLabel("File");



        // now it's time to work with the menu. I'm only going to add a basic File menu

        // but you could add more!



        // now we can start working on the content of the menu~ this gets a little repetitive,

      // so please bare with me!



        // time for the repetitive stuff. let's add the "Open" option

        this.openFile.setLabel("Open"); // set the label of the menu item

        this.openFile.addActionListener(this); // add an action listener (so we know when it's been clicked

        this.openFile.setShortcut(new MenuShortcut(KeyEvent.VK_O, false)); // set a keyboard shortcut

        this.file.add(this.openFile); // add it to the "File" menu



        // and the save...

        this.saveFile.setLabel("Save");

        this.saveFile.addActionListener(this);

        this.saveFile.setShortcut(new MenuShortcut(KeyEvent.VK_S, false));

        this.file.add(this.saveFile);



        // and finally, the close option

        this.close.setLabel("Close");

        // along with our "CTRL+F4" shortcut to close the window, we also have

      // the default closer, as stated at the beginning of this tutorial.

        // this means that we actually have TWO shortcuts to close:

        // 1) the default close operation (example, Alt+F4 on Windows)

        // 2) CTRL+F4, which we are about to define now: (this one will appear in the label)

        this.close.setShortcut(new MenuShortcut(KeyEvent.VK_F4, false));

        this.close.addActionListener(this);

        this.file.add(this.close);

    }



    public void actionPerformed (ActionEvent e) {

        // if the source of the event was our "close" option

        if (e.getSource() == this.close)

            this.dispose(); // dispose all resources and close the application



        // if the source was the "open" option

        else if (e.getSource() == this.openFile) {

            JFileChooser open = new JFileChooser(); // open up a file chooser (a dialog for the user to browse files to open)

            int option = open.showOpenDialog(this); // get the option that the user selected (approve or cancel)

            // NOTE: because we are OPENing a file, we call showOpenDialog~

            // if the user clicked OK, we have "APPROVE_OPTION"

            // so we want to open the file

            if (option == JFileChooser.APPROVE_OPTION) {

                this.textArea.setText(""); // clear the TextArea before applying the file contents

                try {

                    // create a scanner to read the file (getSelectedFile().getPath() will get the path to the file)

                    Scanner scan = new Scanner(new FileReader(open.getSelectedFile().getPath()));

                    while (scan.hasNext()) // while there's still something to read

                        this.textArea.append(scan.nextLine() + "\n"); // append the line to the TextArea

                } catch (Exception ex) { // catch any exceptions, and...

                    // ...write to the debug console

                    System.out.println(ex.getMessage());

                }

            }

        }



        // and lastly, if the source of the event was the "save" option

        else if (e.getSource() == this.saveFile) {

            JFileChooser save = new JFileChooser(); // again, open a file chooser

            int option = save.showSaveDialog(this); // similar to the open file, only this time we call

            // showSaveDialog instead of showOpenDialog

            // if the user clicked OK (and not cancel)

            if (option == JFileChooser.APPROVE_OPTION) {

                try {

                    // create a buffered writer to write to a file

                    BufferedWriter out = new BufferedWriter(new FileWriter(save.getSelectedFile().getPath()));

                  out.write(this.textArea.getText()); // write the contents of the TextArea to the file

                    out.close(); // close the file stream

                } catch (Exception ex) { // again, catch any exceptions and...

                    // ...write to the debug console

                    System.out.println(ex.getMessage());

                }

            }

        }

    }

    // the main method, for actually creating our notepad and setting it to visible.

    public static void main(String args[]) {

      Notepad app = new Notepad();

        app.setVisible(true);

}

}

0

我认为我倾向于在同一页上交互Java和Javascript,并提供一个“导出”按钮,将其本地序列化为PNG格式,并作为下载提供(应该可以在用户无需刷新页面或搞乱的情况下完成)。在这个之前的问题中有一些有趣的评论:Java applet - saving an image in a png format


0

我在这篇文章上方发布的记事本程序可以加载任何类型的图像并保存任何类型的图像...

因此,您可以参考相同的代码来加载图像和保存图像


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接