Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.gui > #3998

Re: Anti-aliasing in imag

From "Daniele Futtorovic" <daniele.futtorovic@THRWHITE.remove-dii-this>
Subject Re: Anti-aliasing in imag
Message-ID <g84ob3$ner$1@registered.motzarella.org> (permalink)
Newsgroups comp.lang.java.gui
References <48a4c7b8$0$4030$b9f67a60@news.newsdemon.com>
Date 2011-04-27 15:48 +0000
Organization TDS.net

Show all headers | View raw


  To: comp.lang.java.gui
On 15/08/2008 02:03, Knute Johnson allegedly wrote:
> Daniele Futtorovic wrote:
>> On 14/08/2008 17:20, Knute Johnson allegedly wrote:
>>> Well there's a truth that it took me a while to learn and that is 
>>> that you can't draw alpha into an image.
>>
>> Must be jolly interesting if it's something that took you a while to
>> learn. So... what does that sentence mean?
> 
> If you have an image, you basically can't draw on it (with the usual 
> Graphics(2D) methods) and reduce the alpha value of the pixels in the 
> image.  Say you have a pixel that is white with an alpha of 255.  There 
> is no way to draw on the image to change that pixel's alpha to another 
> value.  Unless of course you use an AlphaComposite with a value of 
> Clear.  That will change it to a black pixel with an alpha of 0.

Hmmm. Having played around, and more importantly thought about it a bit, 
I'll have to concur with your assessment.

For the record, here's the last state of my experiments. It achieves the 
desired effect, but it's cheating (drawing twice and clipping in-between):

<code>
package scratch;

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

/**
  *
  * @author da.futt
  */
public class XORTest
{
     public static void main(String[] ss) {
         EventQueue.invokeLater(
         new Loader() {
             public BufferedImage loadImage() throws Exception {
                 return 
ImageIO.read(XORTest.class.getResource("animage.png"));
             }
         });
     }

     private static abstract class Loader
     implements Runnable
     {
         public abstract BufferedImage loadImage()
         throws Exception;

         private Image prepareImage()
         throws Exception
         {
             BufferedImage i = loadImage();

             BufferedImage bi = new BufferedImage(i.getWidth(), 
i.getHeight(),
             BufferedImage.TYPE_INT_ARGB_PRE);
             Graphics2D g = bi.createGraphics();

             g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
             RenderingHints.VALUE_ANTIALIAS_ON);

             int d = Math.min(i.getWidth(), i.getHeight()) >> 1;

             Shape ell = new Ellipse2D.Float((i.getWidth() - d) >> 1,
             (i.getHeight() - d) >> 1, d, d);

             Shape oldclip = g.getClip();

             g.clip(ell);
 
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, .3f));
             g.drawImage(i, 0, 0, null);

             g.setClip(oldclip);
 
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OUT));
             g.drawImage(i, 0, 0, null);

             g.dispose();

             return bi;
         }

         public void run() {
             try {
                 run0();
             }
             catch (Exception x) {
                 x.printStackTrace();
             }
         }

         private void run0()
         throws Exception
         {
             JFrame f = new JFrame("XOR paint test");
             f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             f.setContentPane(new BackgroundPanel(new BorderLayout()));

             f.getContentPane().setPreferredSize(new Dimension(300, 200));

             f.getContentPane().add(new JLabel(new ImageIcon(
             prepareImage())), BorderLayout.CENTER);

             f.pack();

             f.setLocationRelativeTo(null);
             f.setVisible(true);
         }
     }

     private static class BackgroundPanel
     extends JPanel
     {
         private static final int MARMOR_SIDE_PX = 20;

         public BackgroundPanel() {
             super();
         }

         public BackgroundPanel(LayoutManager layout) {
             super(layout);
         }

         @Override
         public void paintComponent(Graphics g) {
             Color white = new Color(0xf0f0f0),
             black = new Color(0x0f0f0f);

             int x = 0, y = 0, line = 0, col = 0;

             for (final int h = getHeight(),  w = getWidth(); y < h;
                     y += MARMOR_SIDE_PX, line++, col = 0, x = 0)
             {
                 for (; x < w; x += MARMOR_SIDE_PX, col++) {
                     g.setColor((col + line) % 2 == 0 ? black : white);
                     g.fillRect(x, y, MARMOR_SIDE_PX, MARMOR_SIDE_PX);
                 }
             }
         }
     }
}
</code>



-- 
DF.

---
 * Synchronet * The Whitehouse BBS --- whitehouse.hulds.com --- check it out free usenet!
--- Synchronet 3.15a-Win32 NewsLink 1.92
Time Warp of the Future BBS - telnet://time.synchro.net:24

Back to comp.lang.java.gui | Previous | Next | Find similar


Thread

Re: Anti-aliasing in imag "Daniele Futtorovic" <daniele.futtorovic@THRWHITE.remove-dii-this> - 2011-04-27 15:48 +0000

csiph-web