Re: muting background images
In article <hk49d1$5qf$1@news.eternal-september.org>,
markspace <nospam@nowhere.com> wrote:
Roedy Green wrote:
If you wanted to use an image as background often you need to
"mute" it, so that you can still read foreground text laid over
top.
Just what do I mean by muting?
I am not quite sure, but it might consist of:
1. an effect like looking through a screen door to break the
background up and provide some uniform contrasting colour for the
lettering.
2. unenhancing contrast.
3. blurring.
4. shifting all the colours toward a mid grey tone.
#4 is called "desaturation."
I use Gimp. Great photo editing software.
A programmatic way of doing this would be great, especially one which
works with all Swing classes, if you're interested in doing some
work.
For Swing, I'd like it to take the background color and an image and
put them together, so the image will match somewhat the requested
background color. Probably, draw the background then draw the image
at some % transparency. Allow the caller to specify the transparency
and the image used. Background color is already a property in Swing
classes.
#3, "blurring", can be done with a convolution, discussed here:
<http://www.jhlabs.com/ip/blurring.html>
and also available as part of Java Advanced Imaging.
Apple's Mac OS X feature called Expos?? darkens background windows when
you press F10 to highlight Application Windows.
<http://www.apple.com/macosx/what-is-macosx/expose.html>
Here's a translucent panel that shows 100% white lettering atop a 50%
transparent black background. You can use this demo to find the value of
the result:
<http://sites.google.com/site/drjohnbmatthews/composite>
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
/** @author John B. Matthews */
public class Translucent extends JPanel implements ActionListener {
private static final Font font =
new Font("Serif", Font.PLAIN, 36);
private static final SimpleDateFormat format =
new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss");
private final Timer timer = new Timer(1000, this);
public Translucent() {
super(true);
this.setPreferredSize(new Dimension(360, 100));
timer.start();
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setComposite(AlphaComposite.SrcAtop);
g2d.fillRect(0, 0, getWidth(), getHeight());
g2d.setFont(font);
String s = format.format(new Date());
int xx = this.getWidth();
int yy = this.getHeight();
int w2 = g.getFontMetrics().stringWidth(s) / 2;
int h2 = g.getFontMetrics().getDescent();
g2d.setColor(Color.green);
g2d.drawString(s, xx / 2 - w2, yy / 2 + h2);
}
private static void create() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setBackground(new Color(0.0f, 0.0f, 0.0f, 0.5f));
f.add(new Translucent());
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
create();
}
});
}
@Override
public void actionPerformed(ActionEvent e) {
this.repaint();
}
}
--
John B. Matthews
trashgod at gmail dot com
<http://sites.google.com/site/drjohnbmatthews>