如何将 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();
    }
}