Java JPEG编码器-从命令行设置质量

Java JPEG编码器-从命令行设置质量,java,jpeg,encoder,Java,Jpeg,Encoder,我正在制作一个JPEG图像编码器。目前,为了对图像进行编码,用户输入他们希望编码的文件名以及结果将创建的文件名 我希望用户能够在命令行中设置编码的质量。我尝试重命名newjpegencoder(image,100,newfileoutputstream(args[1])中的第二个参数(100); encoder.Compress()到args[2]但这不起作用 public class JPGencoder { public static void main ( String[] args

我正在制作一个JPEG图像编码器。目前,为了对图像进行编码,用户输入他们希望编码的文件名以及结果将创建的文件名

我希望用户能够在命令行中设置编码的质量。我尝试重命名
newjpegencoder(image,100,newfileoutputstream(args[1])中的第二个参数(100);
encoder.Compress()
args[2]
但这不起作用

public class JPGencoder {

  public static void main ( String[] args ) {
  String[] names = ImageIO.getWriterFormatNames();
  BufferedImage image = null;
  JpegEncoder encoder = null; 

  try {
     image = ImageIO.read( new File( args[0] ) );
      System.err.println("Process image " + args[0]);
      System.err.println(image.toString());
  } catch (Exception e) { 
      System.err.println("Problems with image " + args[0]);
  }

  try {
     encoder = new JpegEncoder(image, 100, new FileOutputStream(args[1]));
     encoder.Compress();
  } catch (Exception e) {
      System.out.println("well that didn't work");
  }
}
}

基于此定义,
JpegEncode
构造函数的第二个参数是
int

args[2]
的类型是一个
字符串
,因此“未工作”可能是指“未编译”。要将
args[2]
转换为
int

Integer.parseInt(args[2]);

如果
args[2]
不是有效的
int

,这将引发
NumberFormatException
,使用
ImageIO
设置JPG压缩/质量并不困难。以下是一些可以帮助您开始学习的片段

private ImageWriteParam imageWriterParams;
private ImageWriter imageWriter;
File out = new File("some.jpg");
// ...

Iterator it = ImageIO.getImageWritersBySuffix("jpg");
// presume every iterator has precisely 1 writer
imageWriter = (ImageWriter)it.next();
imageWriterParams = imageWriter.getDefaultWriteParam();
if ( imageWriterParams.canWriteCompressed() ) {
    try {
        imageWriterParams.setCompressionMode( ImageWriteParam.MODE_EXPLICIT );
    } catch(Exception e) {
        e.printStackTrace();
    }
} else {
    logger.log(Level.WARNING, "ImageWriter cannot compress!");
}
imageWriterParams.setCompressionQuality(qualF);

FileImageOutputStream fios = new FileImageOutputStream(out);
imageWriter.setOutput(fios);
imageWriter.write(
    null,
    new IIOImage(image,null,null),
    imageWriterParams );
fios.flush();
fios.close();

你的意思是没有工作?注意
100
是一个
int
args[2]
是一个
字符串。那么如何将其设置为接受一个int?这不起作用;我从第二个try-catch块得到了一个异常。你能打印堆栈跟踪吗?@mKorbel在那篇文章上得到了-1&同时还有一篇文章。我想我一定(又)把某人赶走了另一个SO的标签非常有趣,有时我会查看VB/VBA/VBE或Windows操作系统相关的答案,brrrrr我逃跑了,甜蜜的家:-)