10

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

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

......目前正在使用。

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

这是我正在尝试工作的代码......

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

3 回答 3

27

终于用这段代码做到了......

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);
}
于 2012-11-03T07:38:40.083 回答
7

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

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

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

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

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

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

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

于 2012-11-03T00:05:34.840 回答
2

我遇到了一个类似的问题,答案对我来说不是很清楚,因为当时我对 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();
        }

如果您知道更简单的方法,或者您在我的评论或代码中发现了错误,请在评论中告诉我,以便我进行更改。

于 2015-07-17T19:44:27.033 回答