Буферизованное изображение в форме круга
У меня есть буферизованное изображение из байтового массива. Как мне сделать изображение в круг? Обрезка? Я не хочу круг, я хочу, чтобы оригинальное изображение стало в форме круга и отображало
def bufferedImage = imgSvc.convertByteArrayToBufferedImage(crop.image)
4 ответа
Если bufferedImage
в квадрате, то с этим кодом:
int width = bufferedImage.getWidth();
BufferedImage circleBuffer = new BufferedImage(width, width, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = circleBuffer.createGraphics();
g2.setClip(new Ellipse2D.Float(0, 0, width, width));
g2.drawImage(bufferedImage, 0, 0, width, width, null);
Вы получаете круглое обрезанное изображение в circleBuffer
Это может помочь
g.setClip(new Ellipse2D.Float(x, y, w, h));
g.drawImage(yourBufferedImage, x, y, w, h, null);
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class ImageCircle {
static Image img;
static String imgFile =
"yourFileName.jpg";
public static void main(String[] args) {
try {
img = ImageIO.read(new File(imgFile));
} catch (IOException fne) {
fne.printStackTrace();
}
int width = img.getWidth(null);
int height = img.getHeight(null);
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = bi.createGraphics();
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,null);
try {
ImageIO.write(bi, "PNG", new File("yourFileName.png"));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
Вы можете использовать метод setClip() класса Graphics, чтобы ограничить область рисования графического контекста определенной областью. Недостатком этого является то, что это отсечение не будет сглаженным.
Есть несколько более продвинутых приемов для достижения лучшего результата, см. Ответы на следующие вопросы: