2013-07-18 2 views
0

Я пытаюсь написать метод для своей игры, который примет изображение, шестнадцатеричное значение для старого цвета и шестнадцатеричное значение для нового цвета, а затем преобразует все пиксели старого цвета в новый цвет. В настоящий момент метод окрашивает весь образ в новый цвет, как если бы оператор if вообще не работал. Этот метод:Преобразование цветов

private void convertColors(BufferedImage img, int oldColor, int newColor) 
{ 
    Graphics g = img.getGraphics(); 
    g.setColor(new Color(newColor)); 
    Color old = new Color(oldColor); 

    for(int x = 0; x < img.getWidth(); x++) 
    { 
     for(int y = 0; y < img.getHeight(); y++) 
     { 
      Color tmp = new Color(img.getRGB(x, y)); 
      if(tmp.equals(old)); 
      { 
       System.out.println("Temp=" + tmp.toString() + "Old=" + old.toString() + "New=" + g.getColor().toString()); 
       g.fillRect(x, y, 1, 1); 
      } 
     } 
    } 
    g.dispose(); 
} 

* Шестнадцатеричное для oldColor является 0xFFFFFF (белый) и для newColor является 0xFF0000 (красный).

Используя метод Println я получаю такого рода результаты:

Temp=java.awt.Color[r=0,g=0,b=0]Old=java.awt.Color[r=255,g=255,b=255]New=java.awt.Color[r=255,g=0,b=0] 
Temp=java.awt.Color[r=255,g=255,b=255]Old=java.awt.Color[r=255,g=255,b=255]New=java.awt.Color[r=255,g=0,b=0] 

scond линия выглядит правильно, цвет температура и старый одинаковы, но это явно не тот случай с первым. Я также попытался создать новый BufferedImage и скопировать пиксели, но это оставляет тот же результат ... Не работает ли метод equals, как я думаю, он делает или весь этот метод просто не работает, и есть лучший способ сделать это? Спасибо за помощь.

+0

Получение цветов с помощью getRGB и рисование крошечных прямоугольников - это будет медленно, особенно для игры. Быстрый способ состоял бы в том, чтобы непосредственно манипулировать массивом int, который находится за BufferedImage, а затем нарисовать измененное изображение за один раз. – lbalazscs

+0

@lbalazscs вы правы в этом, я в настоящее время googling, как реализовать, и rgb-фильтр, который соответствует его потребностям. но поскольку он меняет графику изображения, было бы недостаточно назвать эту функцию один раз, после чего сохраненное изображение будет иметь правильные цвета !? – luk2302

+0

@lbalazscs Когда я пытаюсь сделать это: если (в пикселях [х + у * img.getWidth()] == oldColor) \t \t \t \t { \t \t \t \t \t пикселей [х + у * IMG.getWidth()] = newColor; \t \t \t} он переходит в оператор if, но изменение никогда не появляется, хотя я вызываю setRGB: newImg.setRGB (0, 0, img.getWidth(), img.getHeight(), pixels, 0, img.getWidth()); Кстати, что такое офсет и просканировка? – StrongJoshua

ответ

-1

Я получил его на работу; это рабочий метод convertColors:

private BufferedImage convertColors(BufferedImage img, int oldColor, int newColor) 
{ 
    int [] pixels = new int [img.getWidth() * img.getHeight()]; 
    img.getRGB(0, 0, img.getWidth(), img.getHeight(), pixels, 0, img.getWidth()); 
    Color old = new Color(oldColor); 
    Color newC = new Color(newColor); 

    for(int x = 0; x < img.getWidth(); x++) 
    { 
     for(int y = 0; y < img.getHeight(); y++) 
     { 
      Color tmp = new Color(pixels[x + y * img.getWidth()]); 
      if(tmp.equals(old)) 
      { 
       pixels[x + y * img.getWidth()] = newC.getRGB(); 
      } 
     } 
    } 
    img.setRGB(0, 0, img.getWidth(), img.getHeight(), pixels, 0, img.getWidth()); 

    return newImg; 
} 
4

Просто удалите ; после if(tmp.equals(old)).
В противном случае вы сравниваете цвета и ничего не делаете после сравнения и всегда выбираете новый цвет.

Кроме того, что вам нужно реорганизовать ваш код немного, чтобы сделать его немного более эффективным:

Graphics g = img.getGraphics(); 
g.setColor(new Color(newColor)); 

for(int x = 0; x < img.getWidth(); x++) { 
    for(int y = 0; y < img.getHeight(); y++) { 
     if(img.getRGB(x, y) == oldColor) {//check if pixel color matches old color 
      g.fillRect(x, y, 1, 1);//fill the pixel with the right color 
     } 
    } 
} 
g.dispose(); 



Просто потому, что я был заинтересован в этой теме: полагаться на фильтры изображения вы можете сделать все, что с помощью:

class ColorSwapFilter extends RGBImageFilter { 
    int newColor, oldColor; 
    public ColorSwapFilter(int newColor, int oldColor) { 
    canFilterIndexColorModel = true; 
    this.newColor = newColor; 
    this.oldColor = oldColor; 
    } 

    @Override 
    public int filterRGB(int x, int y, int rgb) { 
    return rgb == oldColor ? newColor : oldColor; 
    } 
} 

, который должен быть вызван с помощью

BufferedImage img;//your image 
ColorSwapFilter filter = new ColorSwapFilter(...,...);//your colors to be swapped. 
ImageProducer producer = img.getSource(); 
producer = new FilteredImageSource(producer, filter); 
Image im = Toolkit.getDefaultToolkit().createImage(producer); 
+0

Я сделал эту ошибку слишком много раз, и я поражен, я все еще делаю это ... Использование вашего метода на самом деле не меняет белые пиксели на красный по какой-то причине, поэтому я должен использовать свой, но он также рисует частичное красное изображение за номером. Я посмотрю на это дальше, но спасибо за вашу помощь. – StrongJoshua

+0

Ты прав, моя ошибка. – StrongJoshua

+0

@StrongJoshua обычно мне было бы неинтересно, но поскольку вы указали, что время ответа изменило ситуацию, я почувствовал, что должен это указать. Кстати, я даже не знал, что вы действительно можете изменить «принятый ответ»: O – luk2302

3

У вас есть точка с запятой непосредственно после вашей, если заявление if(tmp.equals(old));

Это esentially говорит Java, что ваш, если оператор имеет только одну команду, связанную с ним, и эта команда является одной точкой с запятой, фактически означает «ничего не делать». Если вы удалите его, он восстановит условие на блоке кода под ним, которое прямо сейчас выполняется каждый раз независимо от состояния.

+0

Вы были первыми, так что, я думаю, вы получили принятый ответ, но я поддержал их обоих. – StrongJoshua

+0

@StrongJoshua ehhhm, на самом деле я был первым ... ^^ – luk2302

+0

@ Kon извините за «кражу» ваших очков, я просто даю вам преимущество в другом месте :) – luk2302

Смежные вопросы