Java JFileChooser 到 select 位图图像

Java JFileChooser to select bitmap image

基本上,我要做的就是使用 JFileChooser 从用户计算机打开位图图像,然后使用简单的过滤器编辑各个像素。我想达到能够以与打开图像相同的方式保存图像的程度,但在我这样做之前,我需要弄清楚如何使用 JFileChooser 实际打开文件。我的问题是我将 inputFile 设置为等于 input.getSelectedFIle() 的值,这会起作用,但它在 if 语句中。话虽这么说,我将如何解决这个问题,并在 if 语句之外使用该文件?另外,在应用滤镜后,我是否需要以特定方式保存位图图像?

这是我的代码;它可能包含一些错误,因为我测试了一些东西来尝试解决问题:

import java.awt.Component;
import java.io.*;
import java.util.Scanner;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;

public class JavaImage
{
private static Component parent;

public static void main(String[] args) throws IOException
{
    FileInputStream in;
    //try catch around the image selection
    try
    {
        JFileChooser input = new JFileChooser();
        FileNameExtensionFilter filter = new FileNameExtensionFilter(
                "BMP Images", "bmp");
        input.setFileFilter(filter);
        int returnVal = input.showOpenDialog(parent);
        File inputFile = input.getSelectedFile();
        if(returnVal == JFileChooser.APPROVE_OPTION) {
            inputFile = input.getSelectedFile();
            Scanner scan = new Scanner(inputFile);
        }
        new FileInputStream(inputFile);
        FileOutputStream out = new FileOutputStream("output.bmp");

        //user selected bitmap image file
        in=FileInputStream(inputFile);


    int i = 0;
    int counter = 0;

    //edits the actual pixels of the bitmap image
    while((i==in.read())&&i!=-1) {
        if (++counter>54)   // skip past Bitmap headers
        {
            //use BGR format subpixels to process 
            int b =i; //stores blue byte
            int g = in.read(); //read green bye
            int r = in.read();//read red byte

            //greyscale
            int gray = (r+g+b)/3;
            b=gray; g=gray; b=gray;



            out.write(b);// output the blue byte
            out.write(g);// output the green byte
            i=r; //prep red byte for output

        }
        out.write(i);
    }
    in.close();
    out.close();

}
//the error message if user enters a non bitmap file
    catch (IOException ImageError)
        {
            JOptionPane.showConfirmDialog(null, "No such file");
        }
}
}

您的方向是正确的,但除非用户选择 JFileChooser.APPROVE_OPTION,否则您什么都不应该做(因为对话框已被用户取消而关闭)

JFileChooser input = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter(
            "BMP Images", "bmp");
input.setFileFilter(filter);
if (input.showOpenDialog(parent) == JFileChooser.APPROVE_OPTION) {
    File inputFile = input.getSelectedFile();
    // Process file
}

您可以使用 ImageIO 更轻松地加载图像,这将允许您访问底层像素数据。有关详细信息,请参阅 Reading/Loading an Image

如果您仍然一心想手动处理文件,那么您真的应该也看看 The try-with-resources Statement 并更好地管理您的资源