只是想编辑一些代码,以便输出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;
}
}
答案 0 :(得分:24)
最后用这段代码做了......
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);
}
答案 1 :(得分:6)
您可能希望详细说明代码的实际问题。
一般来说,您使用的第二个小节(或多或少)是正确的方法:
1)ImageIO.write(...)几乎可以使用默认值,它不需要额外的配置。
2)如果你想调整参数,例如对于压缩率,您应该使用ImageWriter。您可以使用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)中创建的配置对象。
答案 2 :(得分:1)
我遇到了类似的问题,答案对我来说不是很清楚,因为当时我对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, etc... being made
writer.write(null, new IIOImage(imagem, null, null), iwParam);
writer.dispose();
// Write to altered image in memory to the final file
ImageIO.write(imagem, "jpg", ios);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
如果您知道更简单的方法,或者您在我的评论或代码中发现错误,请在评论中告诉我,以便我可以更改。