Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Изменение тона у изображения


Автор: slip_stream 24.5.2008, 09:15
Доброго времени суток.

Есть ли возможность с помощью Джавы изменять тон (hue) у всей картинки целиком?

К примеру, чтобы из такой картинки:
user posted image
получить такую:
user posted image

Автор: dorogoyIV 24.5.2008, 10:23
Цитата(slip_stream @  24.5.2008,  09:15 Найти цитируемый пост)
Есть ли возможность с помощью Джавы изменять тон (hue) у всей картинки целиком?

возможность то есть!!!
только одной строкой не отделаешься.
судя по картинкам, надо заменить желтый цвет на красный, плюс оттенки
можно написать свой фильтр цвета...

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

Автор: slip_stream 24.5.2008, 10:58
Цитата(dorogoyIV @  24.5.2008,  10:23 Найти цитируемый пост)
если такие маленькие картинки, то, возможно проще будет использовать несколько картинок - выделил - стала красной(поставил красную картинку), убрал выделение - стала желтой(поставил желтую картинку)

С таким вариантом все конечно проще, но интересует именно динамическая обработка.

Цитата(dorogoyIV @  24.5.2008,  10:23 Найти цитируемый пост)
можно написать свой фильтр цвета...

Можно хотя бы имена каких-нибудь классов/интерфейсов, нужных для этой задачи? С обработкой изображений на Джаве раньше не сталкивался, поэтому буду рад, если хотя бы примерное направление укажете.

Автор: dorogoyIV 24.5.2008, 19:48
примерно так, фильтр доделывай под себя  smile 
Код

import java.awt.*;
import java.awt.image.*;
import javax.swing.*;

public class ReplaceColor2 extends JComponent
{
 private Image img, img2;

 public ReplaceColor2()
 {
  img = getToolkit().getImage("1.gif");

  RGBImageFilter rgb_f = new ColorFilter();
  img2 = createImage(new FilteredImageSource(img.getSource(), rgb_f));
 }

 public void paintComponent(Graphics g)
 {
  g.drawImage(img, 0, 0, this);
  g.drawImage(img2, img.getWidth(null), 0, this);
 }

 public static void main(String [] args)
 {
  JFrame f = new JFrame();
  f.setBounds(100, 100, 400, 300);
  f.add(new ReplaceColor2());
  f.setVisible(true);
  f.setDefaultCloseOperation(3);
 }
}

class ColorFilter extends RGBImageFilter
{
 ColorFilter()
 {
  canFilterIndexColorModel = true;
 }

 public int filterRGB(int x, int y, int rgb)
 {
  return rgb >> 2;
 }
}

Автор: slip_stream 26.5.2008, 00:48
Так, с фильтром получилось, спасибо. Поставил свой фильтр в ваш код, получилось как раз то, что надо.
Но тут другая проблемка. Эти картинки должны быть иконками в дереве. Делаю следующим образом:

Рендерер для дерева:
Код

private class MyTreeCellRenderer extends DefaultTreeCellRenderer {

    public Component getTreeCellRendererComponent(JTree tree, Object value,
            boolean sel, boolean expanded, boolean leaf, int row,
            boolean hasFocus) {
        super.getTreeCellRendererComponent(tree, value, sel, expanded,
                leaf, row, hasFocus);

        final ImageIcon icon = new ImageIcon("...");
        if (...) {
            setIcon(icon);
        } else {
            setIcon(new MyIcon(icon));
        }

        return this;
    }
}


И своя реализация для иконок:
Код

private class MyIcon implements Icon {

    final ImageIcon icon;

    public MyIcon(final ImageIcon icon) {
        this.icon = icon;
    }

    public int getIconHeight() {
        return icon.getIconHeight();
    }

    public int getIconWidth() {
        return icon.getIconWidth();
    }

    public void paintIcon(Component c, Graphics g, int x, int y) {
        BufferedImage imgSrc = ((ToolkitImage) icon.getImage())
                .getBufferedImage();

        RGBImageFilter filter = new MyColorFilter();
        Image imgResult = c.createImage(new FilteredImageSource(imgSrc.getSource(),
                filter));

        g.drawImage(imgResult, x, y, c);
    }

}


Проблема: вместо иконок, на которых наложен фильтр, вижу белое поле. Не подскажете, в чем причина?

Автор: dorogoyIV 26.5.2008, 14:55
Код

import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.tree.*;

public class RenderedTree extends JFrame
{
 public RenderedTree()
 {
  JTree tree = new JTree();
  ImageIcon icon = new ImageIcon("12.gif");
  MyTreeCellRenderer renderer = new MyTreeCellRenderer(icon);
  tree.setCellRenderer(renderer);
  add(new JScrollPane(tree));
 }

 public static void main(String [] args)
 {
  JFrame f = new RenderedTree();
  f.setBounds(100, 100, 400, 300);
  f.setVisible(true);
  f.setDefaultCloseOperation(3);
 }
}

class MyImage extends JComponent
              implements Icon
{
 ImageIcon icon;
 Image img, img2;
 RGBImageFilter filter = new ColorFilter();

 MyImage(ImageIcon icon)
 {
  this.icon = icon;
  img = icon.getImage();
  img2 = createImage(new FilteredImageSource(img.getSource(), filter));

  try
  {
   MediaTracker mt = new MediaTracker(this);
   mt.addImage(img2, 0);
   mt.waitForID(0);
  }
  catch(Exception ex){}
 }

 public int getIconHeight()
 {
  return icon.getIconHeight();
 }

 public int getIconWidth()
 {
  return icon.getIconWidth();
 }

 public void paintIcon(Component c, Graphics g, int x, int y)
 {
  g.drawImage(img2, x, y, null);
 }
}

class ColorFilter extends RGBImageFilter
{
 ColorFilter()
 {
  canFilterIndexColorModel = true;
 }

 public int filterRGB(int x, int y, int rgb)
 {
  return ((rgb & 0xff00ff00)
           | ((rgb & 0xff0000) >> 16)
           | ((rgb & 0xff) << 16));
 }
}

class MyTreeCellRenderer extends DefaultTreeCellRenderer
{
 ImageIcon icon;

 MyTreeCellRenderer(ImageIcon icon)
 {
  this.icon = icon;
 }

 public Component getTreeCellRendererComponent(JTree tree, Object value,
            boolean sel, boolean expanded, boolean leaf, int row,
            boolean hasFocus)
 {
  setIcon(sel ? icon : new MyImage(icon));
  setText(value == null ? "" : value.toString());
  setOpaque(true);
  setBackground(sel ? new Color(200, 200, 200) : null);

  return this;
 }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)