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 并更好地管理您的资源
基本上,我要做的就是使用 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 并更好地管理您的资源