Java ARGB to JPG

后端 未结 2 740
灰色年华
灰色年华 2020-12-19 20:08

How can I save BufferedImage with TYPE_INT_ARGB to jpg?

Program generates me that image:

相关标签:
2条回答
  • 2020-12-19 20:23

    Images having 4 color channels should not be written to a jpeg file. We can convert between ARGB and RGB images without duplicating pixel values. This comes in handy for large images. An example:

    int a = 10_000;
    
    BufferedImage im = new BufferedImage(a, a, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = im.createGraphics();
    g.setColor(Color.RED);
    g.fillRect(a/10, a/10, a/5, a*8/10);
    g.setColor(Color.GREEN);
    g.fillRect(a*4/10, a/10, a/5, a*8/10);
    g.setColor(Color.BLUE);
    g.fillRect(a*7/10, a/10, a/5, a*8/10);
    
    //preserve transparency in a png file
    ImageIO.write(im, "png", new File("d:/rgba.png"));
    
    //pitfall: in a jpeg file 4 channels will be interpreted as CMYK... this is no good
    ImageIO.write(im, "jpg", new File("d:/nonsense.jpg"));
    
    //we need a 3-channel BufferedImage to write an RGB-colored jpeg file
    //we can make up a new image referencing part of the existing raster
    WritableRaster ras = im.getRaster().createWritableChild(0, 0, a, a, 0, 0, new int[] {0, 1, 2}); //0=r, 1=g, 2=b, 3=alpha
    ColorModel cm = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB).getColorModel(); //we need a proper ColorModel
    BufferedImage imRGB = new BufferedImage(cm, ras, cm.isAlphaPremultiplied(), null);
    
    //this image we can encode to jpeg format
    ImageIO.write(imRGB, "jpg", new File("d:/rgb1.jpg"));
    
    0 讨论(0)
  • 2020-12-19 20:33

    OK! I've solved it. Everything was pretty easy. Don't know is it a good decision and how fast it is. I have not found any other. So.. everything we need is define new BufferedImage.

    BufferedImage buffImg = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2 = buffImg.createGraphics();
    
    // ... other code we need
    
    BufferedImage img= new BufferedImage(buffImg.getWidth(), buffImg.getHeight(), BufferedImage.TYPE_INT_RGB);
    Graphics2D g2d = img.createGraphics();
    g2d.drawImage(buffImg, 0, 0, null);
    g2d.dispose();
    

    If there any ideas to improve this method, please, your welcome.

    0 讨论(0)
提交回复
热议问题