2012-11-02 12 views
8

nur wollen setzen einige Code bearbeitet werden, so dass der Ausgang jpg Qualität nicht die Standardeinstellung geringer Qualität ist, dassJava wie jpg Qualität

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

..... derzeit verwendet.

Ich habe mir einige andere Java-Beispiele für Einstellungsqualität angeschaut, die mit Java nicht sehr vertraut sind. Ich habe Probleme zu verstehen, wie ich ein paar Beispiele einfüge, die ich bei der Verwendung von Java gesehen habe Qualität.

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

Hier ist der Code Ich versuche, Arbeit zu bekommen ........

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

Ist es Code von Minecraft? : D – barwnikk

Antwort

24

tat es schließlich mit diesem Code ...

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

für die von Ihnen, die nicht in Diskette schreiben möchten : 'ByteArrayOutputStream baos = neues ByteArrayOutputStream(); writer.setOutput (neuer MemoryCacheImageOutputStream (baos)); ... baos.flush(); byte [] returnImage = baos.toByteArray(); baos.close();' – lmiguelmh

6

Sie können auf das, was Ihre eigentliche Problem mit dem Code erarbeiten wollen.

Generell ist die zweite Sniplet Sie wurden unter Verwendung von (mehr oder weniger) den richtigen Ansatz:

1) ImageIO.write (...) verwendet Standardwerte für so ziemlich alles, es erfordert keine zusätzliche Konfiguration .

2) Wenn Sie Parameter optimieren möchten, z. Für die Komprimierungsrate sollten Sie stattdessen einen ImageWriter verwenden. Sie können einen geeigneten Schreiber für jedes Format (in Ihrem Fall jpg) mit ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg");

erhalten 3) Sie legen dann die Konfigurationsparameter für den Writer für eine Instanz von ImageWriteParam festgelegt. Sie könnten ein JPEGImageWriteParam direkt, instanziiert, aber wenn Sie schauen, nur um das Verdichtungsverhältnis zu ändern, es einfacher ist, eine Standardinstanz aufzufordern, die Komprimierungsqualität Set mit ImageWriteParam param = writer.getDefaultWriteParam();

4) wie im obigen Code snipplet gezeigt, und stellen Sie die Komprimierungstyp entsprechend explizit.

5) Der Aufruf an writer.write(null, new IIOImage(image, null, null), iwparam); teilt Ihrer Schreiberinstanz grundsätzlich mit, ein Bild ohne Metadaten oder eingebettete Thumbnails zu erstellen, das nichts außer BufferedImage enthält und das in 3) erstellte Konfigurationsobjekt verwendet.

+0

versuchen { \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, neu IIOImage (var6, null, null), var7); //ImageIO.write(var6, "jpg", var7); } Ich habe versucht, hat nicht funktioniert ...Entschuldigung, ich kann den Code nicht richtig eingeben, diese Seite hat schlechte Antwort (warum sie nicht richtigen Format-Editor für Kommentar Antworten bieten) .. – NestedCodeblocksFTW

+0

iwparam ist nur von einem Code-Beispiel .. Ich habe Probleme mit dem Plugin in den richtigen Variablen vom Code, den ich versuche zu redigieren. – NestedCodeblocksFTW

+0

Ich redigierte ursprünglichen Pfosten mit Code, den ich versuchte, Arbeit zu erhalten (die nicht obwohl er kompilierte ... – NestedCodeblocksFTW

1

stieß ich auf ein ähnliches Problem und die Antwort war nicht ganz klar zu mir, da ich zu der Zeit kein Wissen über ImageIO hatte, so zu den Leuten wie mir, die auf diesen Posten stießen, machte ich ein Beispiel.

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

Wenn Sie einen einfacheren Weg kennen oder finden Sie etwas falsch in meinen Kommentaren oder Code aus, lass es mich wissen in den Kommentaren, so kann ich ändern.

+1

Sie brauche nicht "ImageIO.write (imagem," jpg ", ios);", aber ich nehme an, du hast erfahren, dass es notwendig ist, weil du die Datei noch nicht hast. Das Problem ist: Du hast ios.close() danach vergessen writer.dispose(). So mache ich es (basierend auf deiner Antwort), und es funktioniert ganz gut. –