2012-11-02 12 views
8

che vogliono semplicemente per ottenere un codice modificato in modo che la qualità di stampa jpg non è la qualità a basso impostazione predefinita cheJava come impostare la qualità jpg

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

..... sta utilizzando al momento.

Ho esaminato alcuni altri esempi Java di qualità delle impostazioni, non avendo molta dimestichezza con Java Ho difficoltà a capire come collegare elementi e rielaborare alcuni esempi, che ho visto utilizzando Java per impostare l'immagine qualità.

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

Ecco il codice che sto cercando di ottenere il lavoro ........

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

E 'il codice di minecraft? : D – barwnikk

risposta

24

Infine ha fatto con questo codice ...

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

per quelli di voi che non vogliono scrivere nel disco : 'ByteArrayOutputStream baos = new ByteArrayOutputStream(); writer.setOutput (new MemoryCacheImageOutputStream (baos)); ... baos.flush(); byte [] returnImage = baos.toByteArray(); baos.close();' – lmiguelmh

6

Si potrebbe desiderare di approfondire ciò che il tuo problema reale con il codice è.

In generale, il secondo sniplet si sta utilizzando è (più o meno) l'approccio corretto:

1) ImageIO.write (...) utilizza i valori predefiniti per praticamente tutto, non richiede alcuna configurazione aggiuntiva .

2) Se si desidera modificare i parametri, ad es. per il rapporto di compressione, dovresti invece usare un ImageWriter. È possibile ottenere uno scrittore adatto per qualsiasi formato (nel proprio caso jpg) utilizzando ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg");

3) Quindi si impostano i parametri di configurazione che il writer deve utilizzare su un'istanza di ImageWriteParam. È possibile installare direttamente un JPEGImageWriteParam, ma se si desidera modificare il rapporto di compressione è più semplice richiedere un'istanza predefinita utilizzando ImageWriteParam param = writer.getDefaultWriteParam();

4) Impostare la qualità di compressione come mostrato nello snipplet di codice precedente e impostare tipo di compressione per esplicitare di conseguenza.

5) La chiamata a writer.write(null, new IIOImage(image, null, null), iwparam); dice fondamentalmente all'istanza del writer di creare un'immagine senza metadati o anteprime incorporate, contenente nient'altro che BufferedImage e utilizzando l'oggetto di configurazione creato in 3).

+0

try { \t \t ImageWriter writer = (ImageWriter) ImageIO.getImageWritersByFormatName ("jpg"); \t ImageWriteParam var7 = writer.getDefaultWriteParam(); var7.setCompressionMode (ImageWriteParam.MODE_EXPLICIT); var7.setCompressionQuality (0.90f); writer.write (null, new IIOImage (var6, null, null), var7); //ImageIO.write(var6, "jpg", var7); } Ho provato non ha funzionato ...scusate non riesco a inserire il codice correttamente questo sito ha una scarsa risposta (perché non forniscono un vero editore di formato per le risposte ai commenti) .. – NestedCodeblocksFTW

+0

iwparam è solo da qualche esempio di codice .. Sto avendo problemi nel plugin nelle variabili giuste dal codice che sto cercando di modificare .. – NestedCodeblocksFTW

+0

Ho modificato il post originale con il codice che stavo cercando di ottenere un lavoro (che non ha però fatto compilare ... – NestedCodeblocksFTW

1

mi sono imbattuto in un problema simile e la risposta non era molto chiaro per me, dato che al momento non ho avuto una conoscenza su ImageIO, così alle persone come me che sono imbattuto in questo post ho fatto un esempio.

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(); 
     } 

Se siete a conoscenza di un modo più facile o hai scoperto qualcosa che non va nei miei commenti o codice, per favore fatemelo sapere nei commenti in modo che io possa modificare.

+1

You non ho bisogno di "ImageIO.write (imagem," jpg ", ios);", ma immagino tu abbia provato che è necessario perché non hai ancora il file. Il problema è: hai dimenticato ios.close() dopo writer.dispose(). È così che lo faccio (basato sulla tua risposta), e funziona bene. –

Problemi correlati