[英]Java how to set jpg quality
只是想编辑一些代码,以便输出 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;
}
}
终于用这个代码做到了......
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);
}
您可能想详细说明代码的实际问题是什么。
一般来说,您使用的第二个 sniplet 是(或多或少)正确的方法:
1) ImageIO.write(...) 几乎所有东西都使用默认值,它不需要额外的配置。
2) 如果您想调整参数,例如压缩比,您应该使用 ImageWriter。 您可以使用ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg");
为任何格式(在您的情况下为 jpg)获取合适的ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg");
3) 然后在 ImageWriteParam 的实例上设置编写器要使用的配置参数。 您可以直接实例化JPEGImageWriteParam
,但如果您只是想更改压缩率,那么使用ImageWriteParam param = writer.getDefaultWriteParam();
请求默认实例会更容易ImageWriteParam param = writer.getDefaultWriteParam();
4) 按照上面的代码片段设置压缩质量,并相应地将压缩类型设置为显式。
5) 调用writer.write(null, new IIOImage(image, null, null), iwparam);
基本上告诉您的编写器实例创建一个没有元数据或嵌入缩略图的图像,只包含您的 BufferedImage 并使用您在 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();
}
如果您知道更简单的方法,或者您发现我的评论或代码中有问题,请在评论中告诉我,以便我进行更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.