如何使用 java 将图像裁剪成圆形?
How to crop an image into a circle with java?
我真的需要一些帮助。
我正在尝试将图像裁剪成一个圆圈,这很好,但圆圈外的像素保持白色。我怎样才能让它们透明?
我的代码是:
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;
}
试试这个。这会将图像绘制在屏幕上的圆圈内。如果要创建新图像,请从 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);
}
}
我真的需要一些帮助。 我正在尝试将图像裁剪成一个圆圈,这很好,但圆圈外的像素保持白色。我怎样才能让它们透明?
我的代码是:
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;
}
试试这个。这会将图像绘制在屏幕上的圆圈内。如果要创建新图像,请从 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);
}
}