2014-11-21 6 views
4

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

for(int i = 0; i < image.getWidth();i++) 
     for(int j = 0; j < image.getHeight(); j ++) 
     { 
      image.setRGB(i,j , 0); 
     } 

// Я также изменяю третий параметр 0 на другой атрибут. но он все еще не работает. все это черное. Есть ли у вас какие-то идеи?

yin. благодаря

class ImagePanel extends JPanel { 

    private BufferedImage image; 

    public ImagePanel(int width, int height, BufferedImage image) { 
     this.image = image; 
     image = new BufferedImage(width, height, 
       BufferedImage.TYPE_INT_ARGB); 
     repaint(); 
    } 

    /** 
    * Draws the image. 
    */ 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     for (int i = 0; i < image.getWidth(); i++) { 
      for (int j = 0; j < image.getHeight(); j++) { 
       image.setRGB(i, j, 0); 
      } 
     } 
     g.drawImage(image, 0, 0, getWidth(), getHeight(), this); 

    } 

} 
+1

Можете ли вы привести пример того, к чему вы установили третий параметр? – Adam

+0

Какой класс 'образ'? – mkobit

+0

изображение является буферизированным, и я отправляю его в рамку. Я хочу изменить частичную прозрачность изображения. –

ответ

7

Третий параметр - значение ARGB в 32 бит. Это выложено в битовом виде, как:

AAAAAAAA|RRRRRRRR|GGGGGGGG|BBBBBBBBB 

Смотрите Javadoc для BufferedImage.setRGB (предполагая, что вы используете BufferedImage, ваш вопрос на самом деле не говорит ...)

Устанавливает пиксель в этом BufferedImage к указанному значению RGB. Предполагается, что пиксель находится в цветовой модели RGB по умолчанию, TYPE_INT_ARGB, и цветовом пространстве sRGB по умолчанию. Для изображений с IndexColorModel, то индекс с ближайшим цветом выбран

  • Если вы используете тип изображения, который поддерживает прозрачность, важно установить альфа 255 означает полностью непрозрачным, 0 является полностью прозрачным.

Вы можете создать такое значение с использованием сдвига бит.

int alpha = 255; 
int red = 0; 
int green = 255; 
int blue = 0; 

int argb = alpha << 24 + red << 16 + green << 8 + blue 

image.setRGB(i, j, argb); 

К счастью, есть метод getRGB() на java.awt.Color экземпляров, так что вы можете использовать

image.setRGB(i, j, Color.green.getRGB()); 

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

public class StackOverflow27071351 { 
    private static class ImagePanel extends JPanel { 
     private BufferedImage image; 
     public ImagePanel(int width, int height, BufferedImage image) { 
      this.image = image; 
      image = new BufferedImage(width, height, 
        BufferedImage.TYPE_INT_ARGB); 
      repaint(); 
     } 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      for (int i = 0; i < image.getWidth(); i++) { 
       for (int j = 0; j < image.getHeight(); j++) { 
        image.setRGB(i, j, new Color(255, 0, 0, 127).getRGB()); 
       } 
      } 
      g.drawImage(image, 0, 0, getWidth(), getHeight(), this); 
     } 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     int width = 640; 
     int height = 480; 
     frame.setSize(width, height); 
     BufferedImage image = new BufferedImage(width, height, 
       BufferedImage.TYPE_INT_ARGB); 
     frame.getContentPane().setLayout(new BorderLayout()); 
     frame.getContentPane().add(new ImagePanel(width, height, image)); 
     frame.setVisible(true); 
    } 
} 
+0

Спасибо, что ответили. Я использую BufferedImage, и я стараюсь ура. но он тоже не работает. Я использую черное изображение (изображение со всем черным фоном). –

+0

Можете ли вы разместить свой код для создания bufferedimage и отобразить его – Adam

+0

Я просто редактирую. thx –

2

Ну, третий параметр цвета в RGB, так что это будет черный цвет, если вы установите его в 0.

0

Вот пример кода:

private int colorToRGB(int alpha, int red, int green, int blue) { 
     int newPixel = 0; 
     newPixel += alpha; 
     newPixel = newPixel << 8; 
     newPixel += red; 
     newPixel = newPixel << 8; 
     newPixel += green; 
     newPixel = newPixel << 8; 
     newPixel += blue; 

     return newPixel; 
    } 

затем

image.setRGB(i, j, colorToRGB(alpha, 0, 0, 0)) 
+0

спасибо за ответ. что такое альфа, какое значение мне нужно передать? –

+0

Значение альфа составляет от 0 (прозрачный) -> 255, не забывайте, как @Adam упомянул, чтобы установить BufferedImage в TYPE_INT_ARGB – Ammar

+0

Я просто попробовал, он все равно не работает. моя программа проста, я просто помещаю буферизованное изображение в кадр, и я могу изменить прозрачность кадра, но я хочу изменить частичную прозрачность. У вас больше разрешения? –

1

Я использую следующую форму:

int[] pixel = new int[4]; 

// the following four ints must range 0..255 
pixel[0] = redValue; 
pixel[1] = greenValue; 
pixel[2] = bluleValue; 
pixel[3] = alphaValue; 

raster.setPixel(x, y, pixel); 

Чтобы получить растр для BufferedImage, я делаю это:

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
WritableRaster raster = image.getRaster(); 

Я сделал некоторые тесты производительности, так и не нашел, что начинка всех байт значений цвета в одно число, чтобы сделать большую часть разница.

Также хорошо знать технику, где можно нарисовать непрозрачное изображение (например, RGB, а не ARGB) с альфа-значением.

g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float) (yourAlpha))); 
g2d.drawImage(...); 
Смежные вопросы