10

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

3 に答える 3

7

コードの実際の問題が何であるかを詳しく説明したい場合があります。

一般的に言えば、使用していた 2 番目のスニペットは (多かれ少なかれ) 正しいアプローチです。

1) ImageIO.write(...) はほとんどすべてにデフォルト値を使用します。追加の構成は必要ありません。

2) 圧縮率などのパラメータを微調整する場合は、代わりに ImageWriter を使用する必要があります。を使用して、任意の形式(この場合はjpg)に適したライターを取得できますImageWriter writer = ImageIO.getImageWritersByFormatName("jpg");

3) 次に、ライターが ImageWriteParam のインスタンスで使用する構成パラメーターを設定します。を直接インスタンス化することもでき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

I came across a similar problem and the answer was not very clear to me, since at the time i did not have a knowledge on ImageIO, so to the people like me that came across this post i made a example.

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

If you know of a easier way or you found out something wrong in my comments or code, please let me know in the comments so i can alter.

于 2015-07-17T19:44:27.033 に答える