Java如何设置jpg质量

Nes*_*FTW 9 java

只是想编辑一些代码,以便输出jpg质量不是默认的低质量设置

try
        {
            ImageIO.write(var6, "jpg", var7);
        }
Run Code Online (Sandbox Code Playgroud)

.....正在使用.

我已经看了一些其他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);
Run Code Online (Sandbox Code Playgroud)

这是我正在努力工作的代码........

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Nes*_*FTW 25

最后用这段代码做了......

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 对于那些不想写入磁盘的人:`ByteArrayOutputStream baos = new ByteArrayOutputStream(); writer.setOutput(new MemoryCacheImageOutputStream(baos)); ... baos.flush(); byte[] returnImage = baos.toByteArray(); baos.close();` (2认同)

sar*_*can 6

您可能希望详细说明代码的实际问题.

一般来说,您使用的第二个片段(或多或少)是正确的方法:

1)ImageIO.write(...)几乎所有内容都使用默认值,它不需要额外的配置.

2)如果要调整参数,例如压缩比,则应使用ImageWriter.您可以使用任何格式(在您的情况下为jpg)获得合适的作者ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg");

3)然后,您可以在ImageWriteParam的实例上设置编写器使用的配置参数.您可以JPEGImageWriteParam直接实例化,但如果您只想更改压缩率,则使用默认实例请求更容易ImageWriteParam param = writer.getDefaultWriteParam();

4)设置压缩质量,如上面的代码snipplet所示,并相应地将压缩类型设置为显式.

5)调用writer.write(null, new IIOImage(image, null, null), iwparam);基本上告诉你的编写器实例创建一个没有元数据或嵌入缩略图的图像,只包含你的BufferedImage并使用你在3)中创建的配置对象.