1

我已经搜索了一段时间,但无法找到我的问题的答案。

首先我将展示两张对比图:

方法一: 方法一 http://img713.imageshack.us/img713/3558/tcg6.jpg

方法2: 方法2 http://img716.imageshack.us/img716/2755/tcg7.jpg

方法 1 从来没有给我带来任何麻烦,但我最近发现它需要的时间太长,方法 2 解决了这个问题。

方法1的代码:

private void drawDefaultOrientation() {
    for (int x = 0; x < width; x++) {
        for (int y = 0; y < height; y++) {
            int dx = Math.min(x, width - 1 - x);
            int dy = Math.min(y, height - 1 - y);
            if (dx < borderSize || dy < borderSize) {
                inBorder(dx, dy);
            }
            else {
                outBorder(dx, dy);
            }
            bufferedImage.setRGB(xOffset + x, yOffset + y, color.getRGB());
        }
    }
}    

方法2的代码:

private void drawDefaultOrientation() {
    DataBufferInt buffer = (DataBufferInt)bufferedImage.getRaster().getDataBuffer();
    int[] pixelArray = buffer.getData();
    for (int x = 0; x < width; x++) {
        for (int y = 0; y < height; y++) {
            int dx = Math.min(x, width - 1 - x);
            int dy = Math.min(y, height - 1 - y);
            if (dx < borderSize || dy < borderSize) {
                inBorder(dx, dy);
            }
            else {
                outBorder(dx, dy);
            }
            pixelArray[(xOffset + x) + ((yOffset + y) * bufferedImage.getWidth())] = color.getRGB();
        }
    }
}  

另请注意 inBorder(dx, dy); 和outBorder(dx,dy);将颜色变量设置为具有红色、绿色、蓝色和 Alpha 值的颜色。

被叫代码:

    new CustomRectangle(bufferedImage, 220, 90, 15, 245, 5, defaultOrientation) {
        @Override
        public void inBorder(final int dx, final int dy) {
            setColor(new Color(red, green, blue, 255 - Math.min(dx, dy)));
        }

        @Override
        public void outBorder(final int dx, final int dy) {
            setColor(new Color(red, green, blue, 128 - Math.min(dx, dy)));
        }
    }.draw();  

我真的很困惑为什么会有色差。

我真的希望那里的任何人都可以帮助我。首先,我认为它与 Alpha 值有关,但正如所见,方法 2 中仍然存在 alpha 变量。

问候。

4

1 回答 1

0

我建议,对于“简单”的东西(包括框、形状、渐变等),您直接使用 Java2D API。编写起来会更高效、更简单。

例如,用颜色填充图像中的矩形:

public void rectangle(Color color, float x1, float y1, float w, float h) {
    Graphics2D g = bufferedImage.createGraphics();
    g.setColor(color);
    g.fill(new Rectangle2D.Float(x1, y1, w, h));
    g.dispose(); // optional but releases the resource earlier
}

你也可以使用“g”来绘制你需要做的尽可能多的东西。

于 2013-11-09T13:29:07.010 回答