java ImageIO.write() 方法和 png

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5090902/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 09:21:55  来源:igfitidea点击:

ImageIO.write() method and png

javaimage-processing

提问by blue

Why ImageIO.write(bufferedimage_dest,"png",new File(filedest));writes jpg (without transparency colour) file instead png?

为什么ImageIO.write(bufferedimage_dest,"png",new File(filedest));写 jpg(没有透明颜色)文件而不是 png?

Added:

添加:

static BufferedImage createResizedCopy(Image originalImage, 
                int scaledWidth, int scaledHeight, 
                boolean preserveAlpha)
    {
        System.out.println("resizing...");
        int imageType = preserveAlpha ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
        BufferedImage scaledBI = new BufferedImage(scaledWidth, scaledHeight, imageType);
        Graphics2D g = scaledBI.createGraphics();
        if (preserveAlpha) {
                g.setComposite(AlphaComposite.Src);
        }
        g.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null); 
        g.dispose();
        return scaledBI;
    }


  public static void scale(String src, int width, int height, String dest)
     throws IOException {
   BufferedImage bsrc = ImageIO.read(new File(src));
   BufferedImage bdest =
      new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
   bdest = createResizedCopy(bsrc, width, height, false);
   ImageIO.write(bdest,"png",new File(dest));
  }

Added:

添加:

well, in main() function I've called

好吧,在我调用的 main() 函数中

ScaleJPG.scale((args[0],Integer.parseInt(args[1]),Integer.parseInt(args[2]), args[3]););

instead of

代替

ScalePNG.scale((args[0],Integer.parseInt(args[1]),Integer.parseInt(args[2]), args[3]););

ScaleJPG was similiar, previous class in this folder.

ScaleJPG 与此文件夹中的先前类类似。

I must discard notepad and use only IDE. Question to delete.

我必须丢弃记事本并仅使用 IDE。要删除的问题。

采纳答案by Serhiy

Add

添加

g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

before g.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null);to the createResizedCopyfunction.

之前g.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null);createResizedCopy功能。

回答by Bozho

You need your buffered image to have an image type of BufferedImage.TYPE_INT_ARGB

您需要缓冲图像的图像类型为 BufferedImage.TYPE_INT_ARGB

回答by Joachim Sauer

It does not. This simple test class verifies it:

它不是。这个简单的测试类验证了它:

import java.awt.image.*;
import java.io.File;
import javax.imageio.*;

public class Main
{
    public static void main (String [] args) throws Exception
    {
        BufferedImage bi = new BufferedImage(100,100,BufferedImage.TYPE_INT_ARGB);
        ImageIO.write(bi, "png", new File("test.png"));
    }
} 

Compiling and executing it produces a .png file just as expected:

正如预期的那样,编译并执行它会生成一个 .png 文件:

$ javac Main.java
$ java Main
$ file test.png 
test.png: PNG image, 100 x 100, 8-bit/color RGBA, non-interlaced
$