2012-11-02 66 views
8

Chỉ muốn để có được một số mã sửa sao cho chất lượng đầu ra jpg không phải là thiết rằngJava làm thế nào để thiết lập jpg chất lượng

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

..... hiện đang sử dụng mặc định chất lượng thấp.

Tôi đã xem xét một số ví dụ khác về chất lượng cài đặt, không quen thuộc với Java Tôi đang gặp khó khăn khi hiểu cách cắm công cụ và làm lại một số ví dụ. phẩm chất.

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

Đây là mã Tôi đang cố gắng để có được công việc ........

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

Đó là mã từ Minecraft? : D – barwnikk

Trả lời

24

Cuối cùng đã làm nó với mã này ...

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

cho những người bạn của những người không muốn viết trong đĩa : 'ByteArrayOutputStream baos = new ByteArrayOutputStream(); writer.setOutput (new MemoryCacheImageOutputStream (baos)); ... baos.flush(); byte [] returnImage = baos.toByteArray(); baos.close();' – lmiguelmh

6

Bạn có thể muốn xây dựng trên những gì vấn đề thực tế của bạn với mã là.

Nói chung, sniplet thứ hai bạn đang sử dụng là (nhiều hơn hoặc ít hơn) cách tiếp cận đúng:

1) ImageIO.write (...) sử dụng các giá trị mặc định cho hầu hết mọi thứ, nó không đòi hỏi cấu hình thêm .

2) Nếu bạn muốn tinh chỉnh thông số, ví dụ: đối với tỷ lệ nén, bạn nên sử dụng ImageWriter. Bạn có thể có được một trình soạn thảo thích hợp cho bất kỳ định dạng nào (trong trường hợp của bạn là jpg) bằng cách sử dụng ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg");

3) Sau đó bạn thiết lập các tham số cấu hình được sử dụng bởi nhà văn trên một thể hiện của ImageWriteParam. Bạn có thể instanciate một JPEGImageWriteParam trực tiếp, nhưng nếu bạn chỉ muốn thay đổi tỷ lệ nén, thì dễ dàng hơn để yêu cầu một cá thể mặc định bằng cách sử dụng ImageWriteParam param = writer.getDefaultWriteParam();

4) Đặt chất lượng nén như được hiển thị trong đoạn mã trên và đặt loại nén để rõ ràng cho phù hợp.

5) Cuộc gọi đến writer.write(null, new IIOImage(image, null, null), iwparam); về cơ bản sẽ báo cho nhà văn của bạn tạo hình ảnh không có siêu dữ liệu hoặc hình thu nhỏ được nhúng, không chứa gì ngoài BufferedImage của bạn và sử dụng đối tượng cấu hình bạn đã tạo trong 3).

+0

thử { \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, mới IIOImage (var6, null, null), var7); //ImageIO.write(var6, "jpg", var7); } Tôi đã cố gắng không hoạt động ...xin lỗi tôi không thể đưa mã vào đúng trang web này có trả lời kém (tại sao họ không cung cấp trình chỉnh sửa định dạng phù hợp cho trả lời nhận xét) .. – NestedCodeblocksFTW

+0

iwparam chỉ là một số ví dụ về mã .. Tôi gặp sự cố trong plugin trong các biến phù hợp từ mã tôi đang cố gắng chỉnh sửa .. – NestedCodeblocksFTW

+0

Tôi đã chỉnh sửa bài đăng gốc bằng mã Tôi đã cố gắng để có được công việc (mà không mặc dù nó đã biên dịch ... – NestedCodeblocksFTW

1

tôi tình cờ gặp một vấn đề tương tự và câu trả lời là không phải là rất rõ ràng đối với tôi, vì vào thời điểm đó tôi đã không có một kiến ​​thức về ImageIO, vì vậy với những người như tôi đã xem qua bài đăng này, tôi đã làm một ví dụ.

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

Nếu bạn biết cách dễ dàng hơn hoặc phát hiện ra điều gì đó sai trong nhận xét hoặc mã của tôi, vui lòng cho tôi biết trong phần nhận xét để tôi có thể thay đổi.

+1

Bạn không cần "ImageIO.write (imagem," jpg ", ios);", nhưng tôi đoán bạn có kinh nghiệm rằng nó là cần thiết bởi vì bạn chưa có tệp. Vấn đề là: Bạn quên ios.close() sau writer.dispose() Đó là cách tôi làm điều đó (dựa trên câu trả lời của bạn), và nó hoạt động tốt. –

Các vấn đề liên quan