java 画图问题请筒子们来看下 代码: Color cin = new Color(0x9e, 0xa0, 0x9a); g2D.setColor(cin); g2D.fillRect(200, 100, 100, 100); 问题: 要怎样对这个柱形,设置透明度和模糊度? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://tech.techweb.com.cn/archiver/tid-224125.html dr_lou 老兄~ 我打开你给我的网站 把代码复制进类 好不容易整的没错了但运行起来没看到任何效果 设置一个图形貌似根本不可能1.画在window上,让window透明2.画出透明的效果来 模糊不清楚,透明的话,设置Color的时候有alpha值。查一下API,比如new Color(0x9e, 0xa0, 0x9a, 0x80) 半透明 写了个简单的demo:import java.awt.AlphaComposite;import java.awt.Color;import java.awt.Composite;import java.awt.Graphics;import java.awt.Graphics2D;import javax.swing.JComponent;import javax.swing.JFrame;public class Zhuxing extends JComponent { public void paint(Graphics g) { super.paint(g); Graphics2D g2D = (Graphics2D) g; g2D.setColor(Color.lightGray); g2D.fillRect(200, 100, 100, 100); Composite c = g2D.getComposite(); g2D.setColor(Color.blue); g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f)); g2D.fillOval(200, 75, 100, 50); g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.7f)); g2D.fillOval(200, 175, 100, 50); } public static void main(String[] diggy) { JFrame f = new JFrame("柱形"); f.getContentPane().add(new Zhuxing()); f.setSize(400, 300); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); }} 下面这个Demo可以让你全面了解AplpaComposite:import java.awt.AlphaComposite;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Component;import java.awt.Composite;import java.awt.FlowLayout;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.RenderingHints;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.image.BufferedImage;import java.lang.reflect.Field;import javax.swing.JComboBox;import javax.swing.JComponent;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JSlider;import javax.swing.SwingUtilities;import javax.swing.event.ChangeEvent;import javax.swing.event.ChangeListener;public class AlphaCompositesApplication extends JFrame { private CompositePainter painter; private JSlider opacity; private JComboBox composites; public AlphaCompositesApplication() { super("Alpha Composites"); add(painter = new CompositePainter(), BorderLayout.CENTER); JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEADING)); panel.add(buildCompositeSelector()); panel.add(buildOpacitySelector()); add(panel, BorderLayout.SOUTH); setSize(400, 300); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private Component buildOpacitySelector() { opacity = new JSlider(0, 100, 50); opacity.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent changeEvent) { changeComposite(); } }); JPanel panel = new JPanel(); panel.add(new JLabel("0%")); panel.add(opacity); panel.add(new JLabel("100%")); return panel; } private Component buildCompositeSelector() { composites = new JComboBox(new String[] { "CLEAR", "DST", "DST_ATOP", "DST_IN", "DST_OUT", "DST_OVER", "SRC", "SRC_ATOP", "SRC_IN", "SRC_OUT", "SRC_OVER", "XOR" }); composites.setSelectedItem("SRC"); composites.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { changeComposite(); } }); return composites; } private void changeComposite() { String rule = composites.getSelectedItem().toString(); try { Field ruleField = AlphaComposite.class.getDeclaredField(rule); AlphaComposite composite = AlphaComposite.getInstance(ruleField.getInt(null), (float) opacity.getValue() / 100.0f); painter.setComposite(composite); } catch (SecurityException ex) { ex.printStackTrace(); } catch (NoSuchFieldException ex) { ex.printStackTrace(); } catch (IllegalArgumentException ex) { ex.printStackTrace(); } catch (IllegalAccessException ex) { ex.printStackTrace(); } } private final class CompositePainter extends JComponent { private AlphaComposite composite = AlphaComposite.getInstance( AlphaComposite.SRC, 0.5f); @Override protected void paintComponent(Graphics g) { BufferedImage image = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB); Graphics2D g2 = image.createGraphics(); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setColor(Color.BLUE); g2.fillRect(4 + (getWidth() / 4), 4, getWidth() / 2, getHeight() - 8); g2.setColor(Color.RED); g2.setComposite(composite); g2.fillOval(40, 40, getWidth() - 80, getHeight() - 80); g2.dispose(); g.drawImage(image, 0, 0, null); } private void setComposite(AlphaComposite composite) { this.composite = composite; repaint(); } } public static void main(String... args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new AlphaCompositesApplication().setVisible(true); } }); }} diggywang 兄~ 我复制了你的两个demo 代码没有错误,但是都出不了效果 都有main函数的哦,直接写一个类文件就可以运行。 我是建了两个同名称的类,1,AlphaCompositesApplication ;2,Zhuxing 但是点击运行按钮没反映 ,我的其它类都可以。 虽然我没运行大致看了下是实现透明效果,但是模糊效果还是没出来 你是初学者么?强烈怀疑你的IDE。这两个程序在记事本上javac编译,然后java命令运行都可以。我在Notepad上都测过的。 模糊也很简单,只要实现一个java.awt.image.ConvolveOp对象,将原始图像通过ConvolveOp对象的filter方法进行一定规则的过滤就行。 都告诉你了原理,自己专研下API就行了,每天顶啊,up啊,有意义吗?这点时间花在自己思考上,早写出程序来了! 你说的到是没错~ 问题我现在要急着出来 没办法 你说的那方法 貌似是要把我画出来的柱形转换成Image对象 看了一些列子都是直接读本地的图片处理的 这个处理过程 还是比较模糊 还是请指教下 哪个能随便给我一个小小理解的demo就好~ 把画出来的柱形转换成image对象, convolve.filter(BufferedImage src, BufferedImage dst);因为我看到的都是取本地的图片来操作的没办法 新手嘛多多照顾下 自己创建一个BufferedImage,稍微改改.这样绘制效率高很多。package org.virbraligo.swing;import java.awt.AlphaComposite;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Composite;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Transparency;import java.awt.image.BufferedImage;import javax.swing.JComponent;import javax.swing.JFrame;public class Zhuxing extends JComponent { BufferedImage image = null; public void paint(Graphics g) { super.paint(g); if (image == null) { image = ((Graphics2D)g).getDeviceConfiguration() .createCompatibleImage(500, 500, Transparency.TRANSLUCENT); Graphics2D g2D = image.createGraphics(); g2D.setColor(Color.lightGray); g2D.fillRect(200, 100, 100, 100); Composite c = g2D.getComposite(); g2D.setColor(Color.blue); g2D.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC_OVER, 0.3f)); g2D.fillOval(200, 75, 100, 50); g2D.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC_OVER, 0.7f)); g2D.fillOval(200, 175, 100, 50); g2D.dispose(); } ((Graphics2D) g).drawImage(image, null, 0, 0); } public static void main(String[] diggy) { JFrame f = new JFrame("柱形"); f.getContentPane().setLayout(new BorderLayout()); f.getContentPane().add(new Zhuxing(), BorderLayout.CENTER); f.setSize(400, 300); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); }} diggywang 谢谢你提供的demo image = ((Graphics2D)g).getDeviceConfiguration().createCompatibleImage(500,500,Transparency.TRANSLUCENT); 这个方法能不能换一个,因为我原始的背景都别他覆盖了,背景都变成黑色的了。 不可能,这个方法产生的是一个透明图像。TRANSLUCENT属性就是半透明的意思,除非你用了OPAQUE,或者后面又改变了image对象,重新new了一个但又没设置透明属性. diggywang 不好意思 这几天在外出,等会马上结账 这个问题比较头痛啊,我要这个模糊效果,但是这样有一块黑色的背景我本身的背景就无法显示 还有其它的办法没? 给个思路~ 你自己查下产生透明背景的API,上面的DEMO在我机器上是好用的,以前很多图形处理项目上我也是这么处理的,这样是可以产生透明背景的。如果你那里不行,可能跟图形设备有关了。你应该换下思路。 关于读入键盘输入流的一个困惑,求大神解答,快晕了!!! 大家帮我看一下这个程序,关于Timer的。 java jTable中动态取值 java 继承 instanceof 问题 谁能解释一下java中的多态,重载,重写,覆盖的区别阿? 怎么样快速对HashMap进行深层复制 根据IP地址、文件名、文件存放位置能否查找该文件是否存在? 给个建议 为什么APPLET在客户端有异常??急!!!! 关于package包的问题,请高手指教 重新发布jar 包,能不能不重启服务 新手jdbc问题
好不容易整的没错了但运行起来没看到任何效果
1.画在window上,让window透明
2.画出透明的效果来
比如new Color(0x9e, 0xa0, 0x9a, 0x80) 半透明
import java.awt.Color;
import java.awt.Composite;
import java.awt.Graphics;
import java.awt.Graphics2D;import javax.swing.JComponent;
import javax.swing.JFrame;public class Zhuxing extends JComponent { public void paint(Graphics g) {
super.paint(g);
Graphics2D g2D = (Graphics2D) g;
g2D.setColor(Color.lightGray);
g2D.fillRect(200, 100, 100, 100);
Composite c = g2D.getComposite();
g2D.setColor(Color.blue);
g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f));
g2D.fillOval(200, 75, 100, 50);
g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.7f));
g2D.fillOval(200, 175, 100, 50);
} public static void main(String[] diggy) {
JFrame f = new JFrame("柱形");
f.getContentPane().add(new Zhuxing());
f.setSize(400, 300);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}}
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Composite;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.lang.reflect.Field;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;public class AlphaCompositesApplication extends JFrame {
private CompositePainter painter;
private JSlider opacity;
private JComboBox composites;
public AlphaCompositesApplication() {
super("Alpha Composites");
add(painter = new CompositePainter(), BorderLayout.CENTER);
JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEADING));
panel.add(buildCompositeSelector());
panel.add(buildOpacitySelector());
add(panel, BorderLayout.SOUTH);
setSize(400, 300);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private Component buildOpacitySelector() {
opacity = new JSlider(0, 100, 50);
opacity.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent changeEvent) {
changeComposite();
}
});
JPanel panel = new JPanel();
panel.add(new JLabel("0%"));
panel.add(opacity);
panel.add(new JLabel("100%"));
return panel;
}
private Component buildCompositeSelector() {
composites = new JComboBox(new String[] {
"CLEAR",
"DST", "DST_ATOP", "DST_IN", "DST_OUT", "DST_OVER",
"SRC", "SRC_ATOP", "SRC_IN", "SRC_OUT", "SRC_OVER",
"XOR"
});
composites.setSelectedItem("SRC");
composites.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
changeComposite();
}
});
return composites;
}
private void changeComposite() {
String rule = composites.getSelectedItem().toString();
try {
Field ruleField = AlphaComposite.class.getDeclaredField(rule);
AlphaComposite composite = AlphaComposite.getInstance(ruleField.getInt(null),
(float) opacity.getValue() / 100.0f);
painter.setComposite(composite);
} catch (SecurityException ex) {
ex.printStackTrace();
} catch (NoSuchFieldException ex) {
ex.printStackTrace();
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
}
}
private final class CompositePainter extends JComponent {
private AlphaComposite composite = AlphaComposite.getInstance(
AlphaComposite.SRC, 0.5f); @Override
protected void paintComponent(Graphics g) {
BufferedImage image = new BufferedImage(getWidth(), getHeight(),
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = image.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(Color.BLUE);
g2.fillRect(4 + (getWidth() / 4), 4, getWidth() / 2, getHeight() - 8);
g2.setColor(Color.RED);
g2.setComposite(composite);
g2.fillOval(40, 40, getWidth() - 80, getHeight() - 80);
g2.dispose();
g.drawImage(image, 0, 0, null);
} private void setComposite(AlphaComposite composite) {
this.composite = composite;
repaint();
}
}
public static void main(String... args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new AlphaCompositesApplication().setVisible(true);
}
});
}
}
代码没有错误,但是都出不了效果
都有main函数的哦,直接写一个类文件就可以运行。
我是建了两个同名称的类,1,AlphaCompositesApplication ;2,Zhuxing
但是点击运行按钮没反映 ,我的其它类都可以。
虽然我没运行大致看了下是实现透明效果,但是模糊效果还是没出来
你是初学者么?强烈怀疑你的IDE。
这两个程序在记事本上javac编译,然后java命令运行都可以。我在Notepad上都测过的。
你说的到是没错~ 问题我现在要急着出来 没办法
你说的那方法 貌似是要把我画出来的柱形转换成Image对象
看了一些列子都是直接读本地的图片处理的
这个处理过程 还是比较模糊 还是请指教下
convolve.filter(BufferedImage src, BufferedImage dst);
因为我看到的都是取本地的图片来操作的
没办法 新手嘛多多照顾下
自己创建一个BufferedImage,稍微改改.这样绘制效率高很多。package org.virbraligo.swing;import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Composite;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Transparency;
import java.awt.image.BufferedImage;import javax.swing.JComponent;
import javax.swing.JFrame;public class Zhuxing extends JComponent { BufferedImage image = null; public void paint(Graphics g) {
super.paint(g);
if (image == null) {
image = ((Graphics2D)g).getDeviceConfiguration()
.createCompatibleImage(500, 500,
Transparency.TRANSLUCENT);
Graphics2D g2D = image.createGraphics();
g2D.setColor(Color.lightGray);
g2D.fillRect(200, 100, 100, 100);
Composite c = g2D.getComposite();
g2D.setColor(Color.blue);
g2D.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_OVER, 0.3f));
g2D.fillOval(200, 75, 100, 50); g2D.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_OVER, 0.7f));
g2D.fillOval(200, 175, 100, 50);
g2D.dispose();
}
((Graphics2D) g).drawImage(image, null, 0, 0);
} public static void main(String[] diggy) {
JFrame f = new JFrame("柱形");
f.getContentPane().setLayout(new BorderLayout());
f.getContentPane().add(new Zhuxing(), BorderLayout.CENTER);
f.setSize(400, 300);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}}
不可能,这个方法产生的是一个透明图像。TRANSLUCENT属性就是半透明的意思,除非你用了OPAQUE,或者后面又改变了image对象,重新new了一个但又没设置透明属性.
这个问题比较头痛啊,我要这个模糊效果,但是这样有一块黑色的背景我本身的背景就无法显示
还有其它的办法没? 给个思路~