如何将 Graphics2D 转换为 BufferedImage?
How to convert Graphics2D to BufferedImage?
我正在学习图形课程。我当前的任务是使用 Bresenham 算法绘制一个十六进制,并使用基于堆栈的递归算法对其进行洪水填充。所以我需要轮廓的颜色来使用洪水填充。
下面的代码使用 Graphics2D
绘制线条,我需要获取每个绘制像素的颜色。据我了解, Graphics2D
是一种不包含像素的抽象。所以我需要将十六进制转换为 BufferedImage
,使用 .getRGB()
方法并获取像素的颜色。但我无法弄清它的正反面。
如何用 Graphics2D
绘制十六进制的 BufferedImage
?
public void drawHexagon(int x, int y, int edgeLength, int thickness, Graphics2D g2d) {
int cosEdgeLength = (int) (Math.cos(Math.PI / 6) * edgeLength);
BufferedImage image = new BufferedImage(edgeLength*2, cosEdgeLength*2 + edgeLength, BufferedImage.TYPE_INT_RGB);
drawBresenhamLine(x, y, x - edgeLength, y + cosEdgeLength, g2d, thickness);
drawBresenhamLine(x, y, x + edgeLength, y + cosEdgeLength, g2d, thickness);
drawBresenhamLine(x - edgeLength, y + cosEdgeLength, x - edgeLength, y + cosEdgeLength + edgeLength, g2d, thickness);
drawBresenhamLine(x + edgeLength, y + cosEdgeLength, x + edgeLength, y + cosEdgeLength + edgeLength, g2d, thickness);
drawBresenhamLine(x + edgeLength, y + cosEdgeLength + edgeLength, x, y + cosEdgeLength + edgeLength + cosEdgeLength, g2d, thickness);
drawBresenhamLine(x - edgeLength, y + cosEdgeLength + edgeLength, x, y + cosEdgeLength + edgeLength + cosEdgeLength, g2d, thickness);
g2d.drawImage(image, null, 0, 0);
}
void drawBresenhamLine (double xstart, double ystart, double xend, double yend, Graphics2D g, int thickness)
{
double x, y, dx, dy, incx, incy, pdx, pdy, es, el, err;
dx = xend - xstart;
dy = yend - ystart;
incx = sign(dx);
incy = sign(dy);
if (dx < 0) dx = -dx;
if (dy < 0) dy = -dy;
if (dx > dy) {
pdx = incx; pdy = 0;
es = dy; el = dx;
} else {
pdx = 0; pdy = incy;
es = dx; el = dy;
}
x = xstart;
y = ystart;
err = el/2;
g.setStroke(new BasicStroke(thickness, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER));
g.draw(new Line2D.Double(x, y, x, y));
for (int t = 0; t < el; t++) {
err -= es;
if (err < 0) {
err += el;
x += incx;
y += incy;
} else {
x += pdx;
y += pdy;
}
g.draw(new Line2D.Double(x, y, x, y));
}
}
很简单,创建一个BufferedImage然后在上面绘制
int width = 500; // example value
int height = 500; // example value
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = bi.createGraphics();
在您的:
中使用此图形
drawHexagon(int x, int y, int edgeLength, int thickness, Graphics2D g2d)
执行后,您将在这个 BufferedImage 上绘制
如果您想在 BufferedImage 上绘制而不是在面板上绘制,请从 BufferedImage 中获取 Graphics 属性 并在其上绘制:
class DrawingSpace extends JPanel{
private BufferedImage buf;
public DrawingSpace(){
//Initialization of variables and dimensions not shown
buf = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
}
public void drawOnBuffer(){
Graphics g2d = buf.createGraphics();
g2d .setColor(Color.BLUE); //draw the things you want
g2d .fillOval(0,0,200,200); //draw the things you want
g2d .dispose();
}
}
我正在学习图形课程。我当前的任务是使用 Bresenham 算法绘制一个十六进制,并使用基于堆栈的递归算法对其进行洪水填充。所以我需要轮廓的颜色来使用洪水填充。
下面的代码使用 Graphics2D
绘制线条,我需要获取每个绘制像素的颜色。据我了解, Graphics2D
是一种不包含像素的抽象。所以我需要将十六进制转换为 BufferedImage
,使用 .getRGB()
方法并获取像素的颜色。但我无法弄清它的正反面。
如何用 Graphics2D
绘制十六进制的 BufferedImage
?
public void drawHexagon(int x, int y, int edgeLength, int thickness, Graphics2D g2d) {
int cosEdgeLength = (int) (Math.cos(Math.PI / 6) * edgeLength);
BufferedImage image = new BufferedImage(edgeLength*2, cosEdgeLength*2 + edgeLength, BufferedImage.TYPE_INT_RGB);
drawBresenhamLine(x, y, x - edgeLength, y + cosEdgeLength, g2d, thickness);
drawBresenhamLine(x, y, x + edgeLength, y + cosEdgeLength, g2d, thickness);
drawBresenhamLine(x - edgeLength, y + cosEdgeLength, x - edgeLength, y + cosEdgeLength + edgeLength, g2d, thickness);
drawBresenhamLine(x + edgeLength, y + cosEdgeLength, x + edgeLength, y + cosEdgeLength + edgeLength, g2d, thickness);
drawBresenhamLine(x + edgeLength, y + cosEdgeLength + edgeLength, x, y + cosEdgeLength + edgeLength + cosEdgeLength, g2d, thickness);
drawBresenhamLine(x - edgeLength, y + cosEdgeLength + edgeLength, x, y + cosEdgeLength + edgeLength + cosEdgeLength, g2d, thickness);
g2d.drawImage(image, null, 0, 0);
}
void drawBresenhamLine (double xstart, double ystart, double xend, double yend, Graphics2D g, int thickness)
{
double x, y, dx, dy, incx, incy, pdx, pdy, es, el, err;
dx = xend - xstart;
dy = yend - ystart;
incx = sign(dx);
incy = sign(dy);
if (dx < 0) dx = -dx;
if (dy < 0) dy = -dy;
if (dx > dy) {
pdx = incx; pdy = 0;
es = dy; el = dx;
} else {
pdx = 0; pdy = incy;
es = dx; el = dy;
}
x = xstart;
y = ystart;
err = el/2;
g.setStroke(new BasicStroke(thickness, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER));
g.draw(new Line2D.Double(x, y, x, y));
for (int t = 0; t < el; t++) {
err -= es;
if (err < 0) {
err += el;
x += incx;
y += incy;
} else {
x += pdx;
y += pdy;
}
g.draw(new Line2D.Double(x, y, x, y));
}
}
很简单,创建一个BufferedImage然后在上面绘制
int width = 500; // example value
int height = 500; // example value
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = bi.createGraphics();
在您的:
中使用此图形drawHexagon(int x, int y, int edgeLength, int thickness, Graphics2D g2d)
执行后,您将在这个 BufferedImage 上绘制
如果您想在 BufferedImage 上绘制而不是在面板上绘制,请从 BufferedImage 中获取 Graphics 属性 并在其上绘制:
class DrawingSpace extends JPanel{
private BufferedImage buf;
public DrawingSpace(){
//Initialization of variables and dimensions not shown
buf = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
}
public void drawOnBuffer(){
Graphics g2d = buf.createGraphics();
g2d .setColor(Color.BLUE); //draw the things you want
g2d .fillOval(0,0,200,200); //draw the things you want
g2d .dispose();
}
}