2012-02-29 51 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