2016-06-29 5 views
1

Я пытаюсь скопировать цвета из BufferedImage в другой bufferedImage, а ниже - мой код. Я знаю, что я могу использовать graphics.drawImage, но мне нужно изменить определенные цвета, и именно поэтому я копирую цвета по пикселям вместо того, чтобы просто рисовать изображение поверх другого BufferedImage Однако это не работает. строка «t.setRGB», похоже, не влияет на BufferedImage «t» После сохранения изображения «t» я получаю пустое изображение. Что я сделал не так?JAVA Как скопировать цвета из одного bufferedImage в другой

Еще один вопрос. Как изменить метод «myColor», чтобы использовать значение «alpha»?

import java.io.*; 
import java.awt.*; 
import java.awt.image.*; 
import javax.imageio.*; 

public class imgSt{ 

    public static int rgb; 

    public static int myColor(int r, int g, int b){ 
     rgb= (65536 * r) + (256 * g) + (b); 
     return rgb; 
    } 

    public static void main(String args[]){ 

     try { 
      BufferedImage img = ImageIO.read(new File("8.jpg")); 

      BufferedImage t= new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB); 

      int clear=0x000000FF; 
      int color, alpha, r, g, b; 

      for(int i=0; i<img.getWidth(); ++i){ 
       for(int j=0; j<img.getHeight(); ++j){ 

        color = img.getRGB(i,j); 
        alpha = (color>>24) & 0xff; 
        r = (color & 0x00ff0000) >> 16; 
        g = (color & 0x0000ff00) >> 8; 
        b = color & 0x000000ff; 

        t.setRGB(i,j, myColor(r, g, b) ); 
       } 
      } //for 

      ImageIO.write(t, "jpg", new File(" sT.jpg")); 

     } catch (IOException e){ e.printStackTrace(); } 

    }//main 
}//class 

ответ

1

При использовании растра, как предлагается в других ответах, обычно быстрее, чем при использовании getRGB()/setRGB(), в вашем подходе нет ничего принципиально неправильного.

Проблема в том, что методы getRGB()/setRGB() работают с значениями ARGB, а не только RGB. Поэтому, когда ваш метод myColor() оставляет альфа-компонент 0, это в основном означает, что цвет будет на 100% прозрачным. Вот почему вы получаете пустой образ. Вы, вероятно, хотите вместо этого 100% непрозрачных пикселей.

Вот фиксированная версия вашего метода (я вообще считаю, что уборщик придерживаться битовых сдвигов, так что преобразование в/из упакованного представления аналогично), что создает непрозрачные цвета в упакованном формате ARGB:

public static int myColor(int r, int g, int b) { 
    int argb = 0xFF << 24 | r << 16 | g << 8 | b; 
    return argb; 
} 

Я также немного изменил код для распаковки, хотя это не является абсолютно необходимым:

int color = img.getRGB(i,j); 
int alpha = (color >>> 24) & 0xff; 
int r = (color >> 16) & 0xff; 
int g = (color >> 8) & 0xff ; 
int b = color & 0xff; 
+0

Спасибо. Мне жаль, что я так поздно ответил. Мой интернет был вниз. Ваш подход работает, и я также допустил ошибку в сохранении файла, который должен был использовать: ImageIO.write (изображение, «jpg», новый FileOutputStream (fileOutputName)). Вместо этого я использовал новый файл (fileOutputName). Благодаря! –

0

Вы можете сделать это с помощью растра:

BufferedImage imsrc = ... // The source image, RGBA 
BufferedImage imres = ... // The resulting image, RGB or BGR 
WritableRaster wrsrc = imsrc.getRaster() ; 
WritableRaster wrres = imres.getRaster() ; 
for (int y=0 ; y < image.getHeight() ; y++) 
    for (int x=0 ; x < image.getWidth() ; x++) 
     { 
     wrres.setSample(x, y, 0, wrsrc.getSample(x, y, 0)) ; 
     wrres.setSample(x, y, 1, wrsrc.getSample(x, y, 1)) ; 
     wrres.setSample(x, y, 2, wrsrc.getSample(x, y, 2)) ; 
     } 

При использовании растр, вы не должны управлять кодирования изображения, каналы упорядочены Красный Зеленый Синий Alpha. Поэтому я просто просматриваю весь образ, и я копирую RGB-пиксели в результат.