我正在构建一个JPEG图像编码器。就目前而言,为了对图像进行编码,用户输入他们希望编码的文件的名称以及作为结果创建的文件的名称。
我希望用户能够在命令行中设置编码质量。我尝试将new JpegEncoder(image, 100, new FileOutputStream(args[1]));
encoder.Compress();
中的第二个参数(100)重命名为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");
}
} }
答案 0 :(得分:1)
根据JpegEncoder的定义,JpegEncode
构造函数的第二个参数是int
。
args[2]
的类型是String
,因此可能是“无效”,您的意思是“无法编译”。要将args[2]
转换为int
:
Integer.parseInt(args[2]);
如果NumberFormatException
不是有效args[2]
,则会抛出int
。
答案 1 :(得分:0)
使用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();