gpt4 book ai didi

java - 在java中将像素的alpha channel 设置为零

转载 作者:行者123 更新时间:2023-12-04 05:57:09 24 4
gpt4 key购买 nike

我想制作一个小程序,可以让您更改图像选定像素的 Alpha channel 。想想photoshop上的橡皮擦工具。所以,我让程序在图像上绘制颜色,并尝试使用 setRGB(0x00000000,0x00000000,0x00000000)将像素设置为 alpha 0;没有骰子,只是涂成黑色。

我也试过画一个蓝色的椭圆形(效果很好),所以我知道我的鼠标监听器正在工作。 (这在代码中注释掉了)

现在我正在获取该图像的光栅并尝试使用 setPixels() 修改 alpha chanel , 或 setRect() ,但我似乎无法让它工作。我想我的问题是你必须通过的数组。我假设它是一个 10 x 10 像素阵列和 4 个 channel ,因此阵列长度必须为 400。

这是我第一次尝试这个,所以我的代码有点丑,注释掉了很多东西,因为我已经尝试了大约一百万种方法;但它在这里。

提前感谢您的任何帮助。

import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MyFrame extends JFrame implements MouseListener,
MouseMotionListener {

BufferedImage myImage = new BufferedImage(300, 300,
BufferedImage.TYPE_INT_ARGB);
BufferedImage blankImage = new BufferedImage(10, 10,
BufferedImage.TYPE_INT_ARGB);
File myPNG = new File("output.png");
MyPanel mp = new MyPanel();
File tempPNG = new File("temp.png");
File initialFile = new File("test.jpg");
Color blankColor = new Color(0, 0, 0, .0f);
int diameter = 10;
int mouseX = 0;
int mouseY = 0;
boolean mouseClicked = false;
boolean fileCreated;
WritableRaster myRaster;
WritableRaster blankRaster;
int[] emptySquare = new int[400];
ColorModel colorModel = myImage.getColorModel();

public MyFrame() {
setLayout(new BorderLayout());
setSize(800, 800);
add(mp, BorderLayout.EAST);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
setFocusable(true);
addMouseListener(this);
addMouseMotionListener(this);
for (int x = 0; x < 10; x++) {
for (int y = 0; y < 10; y++) {
for (int b = 0; b < 4; b++) {

emptySquare[x * y * b] = 0x00000000;
}
}
}
myRaster = myImage.getRaster();
blankRaster = blankImage.getRaster();

try {

myImage = ImageIO.read(initialFile);
fileCreated = ImageIO.write(myImage, "png", tempPNG);
myImage = ImageIO.read(tempPNG);

} catch (Exception e) {
}
}

public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;

g2d.setColor(Color.BLACK);
// g2d.fillRect(0, 0, 300, 300);
g2d.drawImage(myImage, 0, 0, 300, 300, null);

// g2d.setColor(blankColor);
// g2d.setPaint(Color.blue);

// myImage.
}

private class MyPanel extends JPanel {

private MyPanel() {
}
}

@Override
public void mouseClicked(MouseEvent m) {

repaint();

}

@Override
public void mouseEntered(MouseEvent m) {
// TODO Auto-generated method stub
}

@Override
public void mouseExited(MouseEvent m) {
// TODO Auto-generated method stub
}

@Override
public void mousePressed(MouseEvent m) {

repaint();

}

@Override
public void mouseReleased(MouseEvent m) {
// TODO Auto-generated method stub
}

@Override
public void mouseDragged(MouseEvent m) {

mouseX = m.getX();
mouseY = m.getY();

myRaster.setDataElements(mouseX, mouseY, blankRaster);
myImage = new BufferedImage(colorModel, myRaster, true, null);
myImage.setData(blankRaster);

myRaster.setPixel(mouseX, mouseY, emptySquare);
myImage.setData(blankRaster);
AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .1f);
Graphics2D tempG2d = myImage.createGraphics();
tempG2d.setComposite(AlphaComposite.Clear);
// tempG2d.setColor(Color.blue);

tempG2d.fillOval(mouseX, mouseY, diameter, diameter);

// tempG2d.setColor(blankColor);
// tempG2d.setComposite(AlphaComposite.Src);

for (int i = mouseX; i < mouseX + diameter; i++) {
for (int j = mouseY; j < mouseY + diameter; j++) {
int white = 0xffffff;

Color c = new Color(0xccFF0000, true);
int color = myImage.getRGB(i, j) & 0x00ffffff; // use bitwise &
// to remove
// alpha
// component
myRaster.setPixel(mouseX, mouseY, emptySquare);
myImage.setData(myRaster);

// myImage.setRGB(i,j,color); // transparent white

}

}

// tempG2d.fillOval(mouseX, mouseY, diameter, diameter);
try {
// fileCreated=ImageIO.write(myImage, "png", tempPNG);
} catch (Exception e) {
}
repaint();
}

@Override
public void mouseMoved(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}

最佳答案

相反,使用 getPixel() 在底层Raster ,清除 alpha 字节,并使用 setPixel() 更新图像和更新的数组。另见此相关 example .

关于java - 在java中将像素的alpha channel 设置为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9383988/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com