- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以,我正在尝试做一个绘画程序,我添加了一些功能,但现在我希望能够保存图片。我打开程序,画一幅画,保存它,一切正常!除了图像现在全黑之外。预先感谢您!
(请告诉我是否有不好的代码,因为我仍然是一个学习Java程序员,这对我将来有很大的好处)
类(class):
主类:
import javax.swing.JFrame;
public class Test{
public static void main(String args[]){
Ploofer ploof = new Ploofer();
ploof.setSize(1000, 950);
PumpkinPie f = new PumpkinPie(ploof);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(1000,1000);
f.setResizable(false);
f.setVisible(true);
f.setLayout(null);
f.add(ploof);
}
}
“Ploofer”类:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import javax.swing.JPanel;
public class Ploofer extends JPanel{
private static boolean calledOnce = false;
private BufferedImage img = new BufferedImage(1000, 950, BufferedImage.TYPE_INT_RGB);
static private Color backgroundColor = null;
private PumpkinPie pObj;
@Override
public void paintComponent(Graphics g){
if(calledOnce == false){
pObj = new PumpkinPie(this);
calledOnce = true;
}
super.paintComponent(g);
private Graphics2D g2d = img.createGraphics();
if(pObj.colour != null){
g2d.setColor(pObj.colour);
}
else{
g2d.setColor(Color.BLACK);
}
if(pObj.setToBackgroundColor == true){
pObj.colour = backgroundColor;
pObj.setToBackgroundColor = false;
}
if(pObj.changeBackgroundColor == true){
backgroundColor = pObj.colour;
this.setBackground(backgroundColor);
g2d.setBackground(backgroundColor);
pObj.changeBackgroundColor = false;
update(g2d);
update(g);
}
if(pObj.wipe == true){
g2d.clearRect(0, 0, img.getWidth(), img.getHeight());
g.dispose();
g2d.setBackground(Color.WHITE);
g.drawImage(img, 0, 0, null);
pObj.wipe = false;
repaint();
}
if(pObj.draw == true){
g2d.fillRect(pObj.x, pObj.y, 8, 8);
pObj.draw = false;
}
if(img != null){
g.drawImage(img, 0, 0, null);
}
}
public BufferedImage getImage(){
return img;
}
}
“南瓜派”类:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.Border;
public class PumpkinPie extends JFrame{
public int x;
public int y;
static public boolean draw = false;
static public boolean changeBackgroundColor = false;
static public boolean setToBackgroundColor = false;
static public boolean wipe = false;
static public Color colour = Color.WHITE;
Box box;
private JMenuBar menuBar;
private JMenu file, edit;
private JMenuItem save, saveas, exit, open, clear, changeBackground;
private JPanel colourButton;
private JButton saveButton;
private Icon eraser;
private JLabel eraserLabel;
private JFileChooser fc;
Ploofer ploof = new Ploofer();
public PumpkinPie(JPanel panel){
super("SPLAT! SPLAT!");
file = new JMenu("File");
edit = new JMenu("Edit");
box = Box.createHorizontalBox();
menuBar = new JMenuBar();
open = new JMenuItem("Open file");
save = new JMenuItem("Save");
saveas = new JMenuItem("Save as...");
exit = new JMenuItem("Exit");
clear = new JMenuItem("Clear");
changeBackground = new JMenuItem("Change background color");
colourButton = new JPanel();
eraserLabel = new JLabel();
eraser = new ImageIcon(getClass().getResource("/Resources/Eraser.png"));
fc = new JFileChooser();
fc.setCurrentDirectory(new File("C:\\Users\\" + System.getProperty("user.name") + "\\Pictures"));
fc.setDialogTitle("Choose a location...");
saveButton = new JButton("Save");
panel.setSize(1000, 950);
panel.setLocation(0, 50);
colourButton.setSize(50, 50);
colourButton.setBorder(BorderFactory.createLineBorder(Color.BLACK));
eraserLabel.setIcon(eraser);
eraserLabel.setSize(50, 50);
eraserLabel.setLocation(50, 0);
this.setJMenuBar(menuBar);
setLayout(new BorderLayout());
menuBar.add(file);
menuBar.add(edit);
file.add(open);
file.add(save);
file.add(saveas);
file.add(exit);
edit.add(clear);
edit.add(changeBackground);
setLayout(null);
add(colourButton);
add(eraserLabel);
MouseMoveHandlerer mouseMoveHandler = new MouseMoveHandlerer();
MouseHandlerer mouseHandler = new MouseHandlerer();
ButtonHandlerer buttonHandler = new ButtonHandlerer();
panel.addMouseMotionListener(mouseMoveHandler);
eraserLabel.addMouseListener(mouseHandler);
clear.addActionListener(buttonHandler);
colourButton.addMouseListener(mouseHandler);
changeBackground.addActionListener(buttonHandler);
save.addActionListener(buttonHandler);
saveas.addActionListener(buttonHandler);
}
private class MouseMoveHandlerer extends MouseMotionAdapter{
public void mouseDragged(MouseEvent event){
x = event.getX();
y = event.getY();
draw = true;
repaint();
}
}
private class MouseHandlerer extends MouseAdapter{
public void mouseClicked(MouseEvent event){
if(event.getSource() == colourButton){
colour = JColorChooser.showDialog(null, "Choose a colour", colour);
colourButton.setBackground(colour);
}
else if(event.getSource() == eraserLabel){
setToBackgroundColor = true;
repaint();
colourButton.setBackground(colour);
}
}
}
private class ButtonHandlerer implements ActionListener{
@Override
public void actionPerformed(ActionEvent event) {
if(event.getSource() == save){
}
else if(event.getSource() == saveas){
if(fc.showSaveDialog(saveButton) == JFileChooser.APPROVE_OPTION){
try{
ImageIO.write(ploof.getImage(), "PNG", new File(fc.getSelectedFile().getPath() + ".png"));
}catch(Exception e){
e.printStackTrace();
}
}
}
else if (event.getSource() == clear){
wipe = true;
repaint();
}
else{
changeBackgroundColor = true;
repaint();
}
}
}
}
最佳答案
无法真正遵循您的绘画逻辑,但有一些评论:
不要直接调用 update(...)。 Swing 将在适当的时候调用该方法。绘画方法应该只关心绘画逻辑。
不要使用paintComponent()方法创建BufferedImage。使用 BufferedImage 的要点是将图像绘制到 BufferedImage 上一次,然后在 PaintComponent() 方法中绘制 BufferedImage。
如果您每次都要重新创建 BufferedImage,那么您不妨直接在面板的 Graphics 上绘制。由于您似乎有一堆可以更改的变量,我猜您应该直接在面板上进行绘画,而不必担心 BufferedImage。
Except for the fact that the image is now completely black
您可以根据需要创建 BufferedImage,而不是尝试在 PaintCompnent() 方法中创建图像。查看ScreenImage类(class)。它将允许您创建任何 Swing 组件的图像。
使用此类来创建/保存图像的代码将类似于;
BufferedImage bi = ScreenImage.createImage(yourPanel);
ScreenImage.writeImage(bi, "panel-image.png");
您可能还想查看Custom Painting Approaches了解在 BufferedImage 上绘画和在 PaintComponent() 方法中绘画之间的差异。
关于java - PNG 文件另存为全黑图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33042913/
我正在寻找一种经济合理的解决方案来长时间存储图片。我读到 PNG 文件格式,它与 JPEG 相比具有优越的特性,即在这些类别中: 无专利、无许可、无版税 无质量损失 尚未压缩 我有很多来自 Photo
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
我怎么能用 FFMEG 做到这一点? 输入 : 背景图片:background.png 图片帧列表:image_001.png,image_002.png ...(每张图片为一帧) 输出:所有帧都有背
$ cat png.ll ./packages/apps/Mms/res/mipmap-hdpi/ic_launcher_smsmms.png ./packages/apps/Mms/res/draw
这个问题在这里已经有了答案: Natural Sort Order in C# (18 个答案) 关闭 7 年前。 这是我的代码: private void Method1() { int
我一直在考虑用 Webp 图像替换我的 Android 应用程序中的 png 文件以减小 APK 大小。 虽然结果不错,但我想知道我是否使用了一些 png 转换器/压缩器,并且能够将尺寸减小到比我为
在 gnuplot-4.2.6 中,我可以使用 set term png medium x000000 xffffff set output 'file.png' plot x 这将生成一个带有黑色背
背景: 我正在努力使一堆 PNG 尽可能小。我正在使用诸如 PngOut、PngCrush 和 OptiPng 之类的工具。 问题: 我遇到了一个大小为 1434 KB 但只有 230 x 230 像
我正在使用 ImageMagick 调整图像大小。如果我传递 -resize WxH 选项,它会按预期运行。但是如果我通过 -resize WxH! (在调整大小时忽略纵横比),一些图像,尤其是 PN
如何访问/删除 PNG 元数据? 我正在寻找 Mac 应用程序或 PHP 代码段。 最佳答案 抱歉发布了一个 Windows 软件,但如果你没有找到任何对 MAC 有用的东西,那就是 TweakPNG
到目前为止似乎没有任何效果。我看到了 pnginfo以下消息: concept_Sjet_dream6.png... Image Width: 200 Image Length: 240 Bi
我有一个带有 Alpha channel (即透明度)的 PNG 图像,我需要创建将图像层合成到白色背景上的版本。我想使用可编写脚本的命令,使用 CLI 工具(例如 Image Magick)将 PN
我是初学者。我昨天问了一个类似的问题,但不知何故被否决了。所以这次我尽量简化问题。 带有 alpha png 的 24 位与 32 位 png 相同吗? 非常感谢您的一些提示。 最佳答案 没有“24
我有这个带点的荷兰 pdf 图像: pdf image of the netherlands with dots 当我尝试将此 pdf 转换为 png 图像时,使用 pdftools和 png像这样:
我在我的启动图像通用项目中添加了“Default.png,Default-568h@2x.png,Default@2x.png”这三个文件,我有三个不同的图像,分辨率与苹果中提到的完全相同文档,适用于
我在 Python 中使用 google app engine 并有几个静态 .png 图像文件,但它们都以“image/x-png”内容类型提供。这是一个问题,当我使用像 chrome 这样的浏览器
我做了一个 python 脚本,该脚本设法根据特定模式解散乱序(png)图像,该 python 脚本使用 ffmpeg 并进行 12 次编码来解乱它(通过裁剪特定部分并将其粘贴到现有图片上)。 因此,
我有一个 PNG 图像文件。我想将其转换为 GeoTiff。我安装了 QGIS 软件,但无法使用它,也不知道如何对图像进行地理配准。请帮我。有没有在线软件? 最佳答案 这是一个非常好的教程,其中包含有
我有一堆使用我编写的 Java 图表工具创建的图表 - 它们主要是黑白图表,带有浅绿色的块,偶尔还有其他颜色。它们当前被保存为 JPG 文件,我想将它们插入到我准备按需打印的书中。 这本书是一个 Op
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我是一名优秀的程序员,十分优秀!