2012-02-29 21 views
0

我正在构建一个JPEG图像编码器。按照现状,为了编码图像,用户输入他们希望编码的文件的名称以及作为结果创建的文件的名称。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

那么,最新的问题是什么? – Durandal 2012-02-29 11:20:20

+0

你是怎么意思不起作用的?注意'100'是一个'int','args [2]'是一个'String'。 – hmjd 2012-02-29 11:20:37

+0

如何将它设置为int? – 2012-02-29 11:21:40

回答

1

在此基础上定义的JpegEncoder的第二个参数JpegEncode构造为int

类型的args[2]String所以大概是由“没有工作”你的意思是“没有编译”。要转换args[2]int

Integer.parseInt(args[2]); 

,这将抛出一个NumberFormatException如果args[2]不是有效int

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(); 
+0

只有我的加号之一:-) – mKorbel 2012-02-29 14:53:27

+0

@mKorbel在那篇文章中有一个-1,在同一分钟中有另一篇文章。猜猜我必须让某人离开(再次)。 ;) – 2012-02-29 15:28:03

+0

另一个SO的标签非常有趣,有时我看着VB/VBA/VBE或Windows操作系统相关的答案,brrrrr我跑开了,甜蜜的家:-) – mKorbel 2012-02-29 17:13:42