2013-04-08 2 views
1

Я искал какое-то время, но не смог найти ответ на свой вопрос.Java Graphics2D Color Issue

Сначала я покажу два сравнения фотографии:

Метод 1: method 1 http://img713.imageshack.us/img713/3558/tcg6.jpg

Метод 2: method 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); установите цветовую переменную в цвет с красным, зеленым, синим и альфа-значением.

код вызываемого абонента:

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.

С уважением.

+0

Случайное предположение: разные цветовые пространства? http://en.wikipedia.org/wiki/RGB_color_space –

+0

Я мог бы согласиться на это, если бы цвета были действительно очень разными ... Однако я не уверен, что происходит, потому что цвета не так уж далеки друг от друга. – skiwi

+0

Разница в основном в яркости imo. Другой причиной может быть добавленное смещение или сжатие, искажающее значения RGB. Что делает 'bufferedImage.setRGB (...)' делать? –

ответ

0

Я бы предположил, что для «простой» вещи (включая коробки, фигуры, градиенты и многое другое) вы напрямую используете API Java2D. Это будет более эффективным и простым в написании.

Например, чтобы заполнить прямоугольник в изображении с цветом:

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 
} 

Вы также можете использовать «г», чтобы привлечь как можно больше вещей, как вы должны сделать.