如何用java将图像裁剪成圆形?

ygya80vv  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(905)

我真的需要一些帮助。我试着把一个图像裁剪成一个圆,它很好,但圆外的像素保持白色。我怎样才能让它们透明?
我的代码是:

static ColorImage Circulo(ColorImage img, int radius) {
    for (int x=0; x < img.getWidth(); x++ ) {
            for(int y=0; y < img.getHeight(); y++) {
                if((x - (img.getWidth()/2)) * (x - (img.getWidth()/2)) + (y - (img.getHeight()/2) )* (y - (img.getHeight()/2)) <= (radius*radius)) {
                    img.setColor(x, y, img.getColor(x, y));
                }else {
                    Color c = new Color (255, 255, 255);
                    img.setColor(x, y, c );     
                }
             }
        }
        return img;
    }
jvlzgdj9

jvlzgdj91#

试试这个。这将在屏幕上画一个圆圈内的图像。如果要创建新图像,请从 BufferedImage 并将图像写入其中,而不是其中的图形上下文 paintComponent . 任何图像格式都可以工作,因为这不依赖于图形图像的任何透明度模式。
这背后的主要思想是设置 clip region 变成一个圆。那么你画的东西只会出现在那个区域。
在本例中,我将圆的直径设置为图像宽度和高度的最小值。这样,整个圆将适合于一个矩形。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.geom.Ellipse2D;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ImageInCircle extends JPanel {
    JFrame f = new JFrame();
    Image img;
    int width;
    int height;
    static String imgFile =
             "location/of/image/img.gif";

    public static void main(String[] args) {
        SwingUtilities.invokeLater(()->new ImageInCircle().start());

    }
    @Override
    public Dimension getPreferredSize() {
         return new Dimension(width, height);
    }
    public ImageInCircle () {
        f.add(this);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }
    public void start() {
        try {
        img = ImageIO.read(new File(imgFile));
        } catch (IOException fne) {
            fne.printStackTrace();
        }
        width = img.getWidth(null);
        height = img.getHeight(null);
        revalidate();
        f.setVisible(true);
        f.pack();

        f.setLocationRelativeTo(null);
        repaint(); 
    }

    public void paintComponent(Graphics g) {
         super.paintComponent(g);
          setBackground(Color.white);
          Graphics2D g2 = (Graphics2D) g;

          g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
          int circleDiameter = Math.min(width,height);
          Ellipse2D.Double circle = new Ellipse2D.Double(0,0,circleDiameter,circleDiameter);
          g2.setClip(circle);
          g2.drawImage(img,0,0,this);
    }

}

相关问题