Java JPEG编码器-从命令行设置质量
我正在制作一个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
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我逃跑了,甜蜜的家:-)