我根本无法使用您的手指绘制图像。您的类按原样为组件的宽度和高度返回1。
- 重写
getWidth
和getHeight
返回图像的大小。
- 不要致电
super.paintComponent()
- 在这种情况下它是多余的。
drawImage
接收到最左边,最上面的坐标图像的,所以你可以简单地用0调用它,0
该代码绘制alpha通道适合我:
public class JImageComponent extends JComponent {
private static final long serialVersionUID = -6926323540532721196L;
private final Image image;
public JImageComponent(Image image) {
this.image = image;
}
public JImageComponent(byte[] data) {
this(Toolkit.getDefaultToolkit().createImage(data));
}
@Override
protected void paintComponent(Graphics graphics) {
graphics.drawImage(image, 0, 0, null);
}
@Override
public int getWidth() {
return image.getWidth(null);
}
@Override
public int getHeight() {
return image.getHeight(null);
}
}
编辑:
我以前的代码仍然显示白色背景为你的形象,所以我挖得杓和遍历每个像素:
public class JImageComponent extends JComponent {
private static final long serialVersionUID = -6926323540532721196L;
private final Image image;
public JImageComponent(Image image) {
this.image = image;
}
public JImageComponent(byte[] data) {
this(Toolkit.getDefaultToolkit().createImage(data));
}
@Override
protected void paintComponent(Graphics graphics) {
Graphics2D g2 = (Graphics2D) graphics.create();
int[] pixels = new int[image.getWidth(null)*image.getHeight(null)];
PixelGrabber pg =
new PixelGrabber(image, 0, 0, image.getWidth(null), image.getHeight(null), pixels, 0, image.getWidth(null));
try {
pg.grabPixels();
} catch (InterruptedException e) {
System.err.println("interrupted waiting for pixels!");
return;
}
if ((pg.getStatus() & ImageObserver.ABORT) != 0) {
System.err.println("image fetch aborted or errored");
return;
}
for (int i = 0 ; i < image.getWidth(null) ; i++) {
for (int j = 0 ; j < image.getHeight(null) ; j++) {
handlesinglepixel(i, j, pixels[j * image.getWidth(null) + i], g2);
}
}
}
@Override
public int getWidth() {
return image.getWidth(null);
}
@Override
public int getHeight() {
return image.getHeight(null);
}
public void handlesinglepixel(int x, int y, int pixel, Graphics2D g2d) {
int alpha = (pixel >> 24) & 0xff;
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = (pixel ) & 0xff;
Color color = new Color(red,green,blue);
g2d.setColor(color);
System.out.println("Alpha value is " + (float)(alpha/255));
g2d.setComposite(AlphaComposite.SrcAtop.derive((float)(alpha/255)));
g2d.drawRect(x, y, 1, 1);
}
}
这将打印每一个像素1.0
alpha值,所以我想有一个与你的形象问题......
请编辑您的问题包括[完整的示例](HTTP://计算器。 com/help/mcve),它展示了你描述的问题。在[完整示例](http://stackoverflow.com/help/mcve)中,通过URL访问映像,如[此处](http://stackoverflow.com/a/10862262/230513) – trashgod 2014-09-27 17:50:13
I我补充了更多关于我的意思的信息。我想我只需要使用RGBA而不是RGB,但我不认为这是可能的... – user3746721 2014-09-27 18:03:36