【问题标题】:Java how to set jpg qualityJava如何设置jpg质量
【发布时间】:2020-07-15 06:16:38
【问题描述】:

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

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

.....当前正在使用。

我查看了其他一些设置质量的 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;
    }
}

【问题讨论】:

  • 是我的世界的代码吗? :D

标签: java


【解决方案1】:

终于用这段代码搞定了……

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

【讨论】:

  • 对于那些不想写入磁盘的人:ByteArrayOutputStream baos = new ByteArrayOutputStream(); writer.setOutput(new MemoryCacheImageOutputStream(baos)); ... baos.flush(); byte[] returnImage = baos.toByteArray(); baos.close();
【解决方案2】:

您可能想详细说明代码的实际问题是什么。

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

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

2) 如果你想调整参数,例如对于压缩比,您应该改用 ImageWriter。您可以使用 ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg");

为任何格式(在您的情况下为 jpg)获得合适的作家

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

4) 如上述代码片段所示设置压缩质量,并相应地将压缩类型设置为显式。

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

【讨论】:

  • 尝试 { ImageWriter writer = (ImageWriter) ImageIO.getImageWritersByFormatName("jpg"); 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);我试过没有用...对不起,我不能正确地把代码放在这个网站的回复很差(为什么他们没有为评论回复提供正确的格式编辑器)..
  • iwparam 只是来自一些代码示例。我在尝试编辑的代码中的正确变量的插件中遇到问题。
  • 我用我试图开始工作的代码编辑了原始帖子(虽然它没有编译...
【解决方案3】:

我遇到了一个类似的问题,答案对我来说不是很清楚,因为当时我对 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 and saving to file the altered image
            writer.write(null, new IIOImage(imagem, null, null), iwParam);
            
            writer.dispose();               
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

如果您知道更简单的方法,或者您发现我的 cmets 或代码有问题,请在 cmets 中告诉我,以便我进行更改。

【讨论】:

  • 你不需要 "ImageIO.write(imagem, "jpg", ios);",但我猜你经历过它是必要的,因为你还没有文件。问题是:您在 writer.dispose() 之后忘记了 ios.close()。我就是这样做的(根据你的回答),而且效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
  • 2014-10-29
  • 2018-03-29
相关资源
最近更新 更多