Java-Image图形用户界面
我正在编写一个代码,读取图像URL并在窗口上显示图像,该代码可以将图像旋转180度,可以使图像模糊,并可以将颜色更改为灰色,我正在尝试为每个功能添加一个按钮,我添加了按钮,它们出现了,但由于某种原因,图像根本没有显示出来 有人能告诉我为什么没有显示图像吗 代码如下:Java-Image图形用户界面,java,swing,Java,Swing,我正在编写一个代码,读取图像URL并在窗口上显示图像,该代码可以将图像旋转180度,可以使图像模糊,并可以将颜色更改为灰色,我正在尝试为每个功能添加一个按钮,我添加了按钮,它们出现了,但由于某种原因,图像根本没有显示出来 有人能告诉我为什么没有显示图像吗 代码如下: import java.awt.*; import java.awt.event.*; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImag
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
public class photoApp extends JComponent {
protected BufferedImage img;
protected BufferedImage rotated;
protected JFrame frame;
protected JPanel panel;
protected JButton rotateButton,greyButton,blurButton;
InputMap im = getInputMap(WHEN_FOCUSED);
ActionMap am = getActionMap();
public photoApp() throws MalformedURLException, IOException {
frame = new JFrame("Photo App");
img=ImageIO.read(new
URL("https://i.pinimg.com/originals/3e/7d/b3/3e7db36e4469b80c257eb03468cd5205.jpg"));
rotated = rotateImageByDegrees(img, 180);
panel = new JPanel();
panel.setLayout(new FlowLayout(FlowLayout.CENTER));
rotateButton = new JButton("Rotate");
rotateButton.addActionListener(new ButtonHandler());
greyButton = new JButton("Grascale");
greyButton.addActionListener(new ButtonHandler());
blurButton = new JButton("Blur");
blurButton.addActionListener(new ButtonHandler());
panel.add(rotateButton);
panel.add(greyButton);
panel.add(blurButton);
frame.add(panel,BorderLayout.NORTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
public BufferedImage toGrayScale(BufferedImage img) {
for (int x = 0; x < img.getWidth(); x++) {
for (int y = 0; y < img.getHeight(); y++) {
Color color = new Color(img.getRGB(x, y));
int red = color.getRed();
int green = color.getGreen();
int blue = color.getBlue();
red = green = blue = (int) (red * 0.299 + green * 0.587 + blue * 0.114);
color = new Color(red, green, blue);
int rgb = color.getRGB();
img.setRGB(x, y, rgb);
}
}
return img;
}
public BufferedImage toBlur(BufferedImage img){
Kernel kernel = new Kernel(3, 3,
new float[] {
1f/9f, 1f/9f, 1f/9f,
1f/9f, 1f/9f, 1f/9f,
1f/9f, 1f/9f, 1f/9f});
BufferedImageOp op = new ConvolveOp(kernel);
return img = op.filter(img, null);
}
public BufferedImage rotateImageByDegrees(BufferedImage img, double angle) {
int w = img.getWidth();
int h = img.getHeight();
BufferedImage rotated = new BufferedImage(w, h, img.getType());
Graphics2D graphic = rotated.createGraphics();
graphic.rotate(Math.toRadians(angle), w/2, h/2);
graphic.drawImage(img, null, 0, 0);
graphic.dispose();
return rotated;
}
public Dimension getPreferredSize() {
//Using image size as preferred size
return new Dimension(img.getWidth(), img.getHeight());
}
public Dimension getMinimumSize() {
//Using image size as minimum size
return new Dimension(img.getWidth(), img.getHeight());
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
//Compute scaling for both axis according to current component size
//then use the lower value
double scaleX=getWidth()*1.0/img.getWidth();
double scaleY=getHeight()*1.0/img.getHeight();
double scale=Math.min(scaleX, scaleY);
//Center the image on the axis with greater scale
double offsetX=(getWidth()-scale*img.getWidth())/2.0;
double offsetY=(getHeight()-scale*img.getHeight())/2.0;
Graphics2D g2=(Graphics2D) g.create();
//This gives a better quality in upscaling, but also slow down the repainting, remove it if the
resizing not responsive enough
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
//We must consider the current possible transform before applying our scaling
//Current transform
AffineTransform at=g2.getTransform();
//Translate to center
at.concatenate(AffineTransform.getTranslateInstance(offsetX, offsetY));
//Scale image
at.concatenate(AffineTransform.getScaleInstance(scale, scale));
g2.setTransform(at);
//Paint the transformed image
g2.drawImage(img, 0, 0, null);
g2.dispose();
}
private class ButtonHandler implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == rotateButton) {
img = toBlur(img);
repaint();
} else if (e.getSource() == greyButton) {
img = toGrayScale(img);
repaint();
} else if (e.getSource() == rotateButton)
{
img = rotateImageByDegrees(img,180);
repaint();
}
}
}
public static void main(String[] args) throws MalformedURLException, IOException {
new photoApp();
}
}
import java.awt.*;
导入java.awt.event.*;
导入java.awt.geom.AffineTransform;
导入java.awt.image.buffereImage;
导入java.awt.image.BufferedImageOp;
导入java.awt.image.ConvolveOp;
导入java.awt.image.Kernel;
导入java.io.IOException;
导入java.net.MalformedURLException;
导入java.net.URL;
导入javax.imageio.imageio;
导入javax.swing.*;
公共类photoApp扩展了JComponent{
受保护的缓冲图像img;
受保护的缓冲区图像旋转;
保护JFrame;
受保护的JPanel面板;
受保护的JButton旋转按钮、灰色按钮、模糊按钮;
InputMap im=getInputMap(聚焦时);
ActionMap am=getActionMap();
public photoApp()引发错误的DurLexception,IOException{
frame=新JFrame(“照片应用”);
img=图像IO.read(新
网址(“https://i.pinimg.com/originals/3e/7d/b3/3e7db36e4469b80c257eb03468cd5205.jpg"));
旋转=以度旋转图像(img,180);
panel=新的JPanel();
panel.setLayout(新的FlowLayout(FlowLayout.CENTER));
rotateButton=新的JButton(“旋转”);
addActionListener(新的ButtonHandler());
灰色按钮=新的JButton(“Grascale”);
addActionListener(newbuttonHandler());
blurButton=新的JButton(“模糊”);
addActionListener(newButtonHandler());
面板。添加(旋转按钮);
面板。添加(灰色按钮);
面板。添加(模糊按钮);
框架。添加(面板,边框布局。北);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
公共BuffereImage toGrayScale(BuffereImage img){
对于(int x=0;x
请提供一个示例,如果您从未将面板添加到JPanel,为什么您认为它应该显示图像?你可以尝试panel.add(这个)代码>@matt它不是minimal@matt我试过了,但图像正在放大in@MohammedHamdoon那么现在这是一个不同的问题?