2012-11-02 57 views
8

只是想獲得一些編輯的代碼,使輸出JPG質量是不是默認的低品質設置的Java如何設置JPG質量

try 
     { 
      ImageIO.write(var6, "jpg", var7); 
     } 

.....當前正在使用。

我看了一些其他java設置質量的例子,不是很熟悉Java我很難理解如何插入東西和重做一些例子,我已經看到使用Java來設置圖像質量。

ImageWriteParam iwparam = new JPEGImageWriteParam(Locale.getDefault()); 
    iwparam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
    iwparam.setCompressionQuality(quality); 
    writer.write(null, new IIOImage(image, null, null), iwparam); 

這裏是我試圖找到工作的代碼........

public static String func_74292_a(File par0File, String par1Str, int par2, int par3) 
{ 
    File var4 = new File(par0File, "screenshots"); 
    var4.mkdir(); 
    int var5 = par2 * par3; 

    if (field_74293_b == null || field_74293_b.capacity() < var5) 
    { 
     field_74293_b = BufferUtils.createIntBuffer(var5); 
     field_74294_c = new int[var5]; 
    } 

    GL11.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 1); 
    GL11.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1); 
    field_74293_b.clear(); 
    GL11.glReadPixels(0, 0, par2, par3, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, field_74293_b); 
    field_74293_b.get(field_74294_c); 
    func_74289_a(field_74294_c, par2, par3); 
    BufferedImage var6 = new BufferedImage(par2, par3, 1); 
    var6.setRGB(0, 0, par2, par3, field_74294_c, 0, par2); 

    if (par1Str == null) 
    { 
     var7 = func_74290_a(var4); 
    } 
    else 
    { 
     var7 = new File(var4, par1Str); 
    } 

    try 
    { 
     ImageIO.write(var6, "jpg", var7); 
    } 
    catch (IOException var8) 
    { 
     ; 
    } 

    Thread var7x = new Thread(new ScreenShotHelper$1()); 
    var7x.start(); 
    return "\u00a7aUploading Screenshot...."; 
} 

private static File func_74290_a(File par0File) 
{ 
    String var1 = dateFormat.format(new Date()).toString(); 
    int var2 = 1; 

    while (true) 
    { 
     File var3 = new File(par0File, var1 + (var2 == 1 ? "" : "_" + var2) + ".jpg"); 

     if (!var3.exists()) 
     { 
      return var3; 
     } 

     ++var2; 
    } 
} 
+1

它是我的世界的代碼嗎? :D – barwnikk

回答

24

最後這段代碼做了...

try 
{ 

    ImageOutputStream ios = ImageIO.createImageOutputStream(var7); 
    Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("jpeg"); 
    ImageWriter writer = iter.next(); 
    ImageWriteParam iwp = writer.getDefaultWriteParam(); 
    iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
    iwp.setCompressionQuality(0.85f); 
    writer.setOutput(ios); 
    writer.write(null, new IIOImage(var6,null,null),iwp); 
    writer.dispose(); 

    //ImageIO.write(var6, "jpg", var7); 
} 
+1

爲那些你不想寫在磁盤上:'ByteArrayOutputStream baos = new ByteArrayOutputStream(); writer.setOutput(new MemoryCacheImageOutputStream(baos)); ... baos.flush(); byte [] returnImage = baos.toByteArray(); baos.close();' – lmiguelmh

6

您可能希望詳細說明你的代碼實際的問題是什麼。

一般來說,你使用第二sniplet是(或多或少)正確的做法:

1)ImageIO.write(...)使用缺省值幾乎一切,它不需要額外的配置。

2)如果你想調整參數,例如對於壓縮比率,您應該改用ImageWriter。你可以使用ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg");

獲得任何格式的合適的作家(你的情況jpg)3)然後設置配置參數供Writer在ImageWriteParam的一個實例上使用。你可以實例化一個JPEGImageWriteParam直接,但如果你只是希望改變壓縮比它更容易使用ImageWriteParam param = writer.getDefaultWriteParam();

4)將壓縮質量如上面的代碼snipplet請求默認實例,並設置壓縮類型相應地明確。

5)writer.write(null, new IIOImage(image, null, null), iwparam);的調用基本上告訴您的編寫器實例創建一個沒有元數據或嵌入式縮略圖的圖像,只包含BufferedImage和使用3)中創建的配置對象。

+0

嘗試 { \t \t ImageWriter writer =(ImageWriter)ImageIO.getImageWritersByFormatName(「jpg」); \t ImageWriteParam var7 = writer.getDefaultWriteParam(); var7.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); var7.setCompressionQuality(0.90f); write.write(null,new IIOImage(var6,null,null),var7); //ImageIO.write(var6,「jpg」,var7); }我試過沒有工作...對不起,我不能把代碼放在正確的這個網站有很差的回覆(爲什麼他們不提供適當的格式編輯器的評論回覆).. – NestedCodeblocksFTW

+0

iwp​​aram只是從一些代碼示例..我在插件中有正確的變量從我試圖編輯的代碼.. – NestedCodeblocksFTW

+0

我編輯原代碼與代碼我試圖得到的工作(雖然沒有,但它沒有編譯... – NestedCodeblocksFTW

1

我遇到了類似的問題,得到的答案是不是對我很清楚,因爲當時我沒有在ImageIO的知識,所以對像我這樣的人來說,我發現這個帖子是一個例子。

try { 

      // Image to be altered 
      BufferedImage imagem = ImageIO.read(new File("c://nota.jpg")); 

      // The output image 
      File outPutImage = new File("c://nota2.jpg"); 

      // Encapsulate the outPut image 
      ImageOutputStream ios = ImageIO.createImageOutputStream(outPutImage); 

      // List of ImageWritre's for jpeg format 
      Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("jpeg"); 

      // Capture the first ImageWriter 
      ImageWriter writer = iter.next(); 

      // define the o outPut file to the write 
      writer.setOutput(ios); 

      // Here you define the changes you wanna make to the image 
      ImageWriteParam iwParam = writer.getDefaultWriteParam(); 
      iwParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
      iwParam.setCompressionQuality(.90f); 

      // Compression, etc... being made 
      writer.write(null, new IIOImage(imagem, null, null), iwParam); 

      writer.dispose(); 

      // Write to altered image in memory to the final file 
      ImageIO.write(imagem, "jpg", ios); 

     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

如果你知道一個更簡單的方法,或者你發現了什麼問題,我的意見或代碼,請讓我在評論中知道這樣我就可以改變。

+1

不需要「ImageIO.write(imagem,」jpg「,ios);」,但是我猜你會遇到這種情況,因爲你還沒有這個文件,問題是:你忘了ios.close()之後writer.dispose()。我就是這麼做的(根據你的回答),它工作得很好。 –