最后需要对图像处理一下,让白的更白,黑的更黑,图片只有两种颜色,(0, 0, 0), (255, 255, 255),没有任何其他中间颜色。Java有函数操作卷积算法,对图像进行处理,例如模糊,锐化,浮雕等。 这有个简单的处理图像的程序,可以参考一下: package com.tur.demo;import javax.swing.*; import java.awt.*; import java.awt.color.ColorSpace; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.*; import java.io.IOException;public class ImageFilterTest { private static ImageFilter imageFilter = new ImageFilter("/Users/Biao/Desktop/x.png"); private static JLabel imageLabel = new JLabel(); private static enum FilterType { ORIGINAL("Original Image"), GRAY("Gray Image"), BLUR("Blur Image"), SHARP("Sharp Image"), EMBOSS("Emboss Image"); private String description; private FilterType(String description) { this.description = description; } @Override public String toString() { return description; } }; public static JButton createImageFilterButton(final FilterType type) { JButton button = new JButton(type.toString()); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { Image image = null; switch (type) { case ORIGINAL: image = imageFilter.getOriginalImage(); break; case GRAY: image = imageFilter.getGrayImage(); break; case BLUR: image = imageFilter.getBlurImage(); break; case SHARP: image = imageFilter.getSharpImage(); break; case EMBOSS: image = imageFilter.getEmbossImage(); break; default: image = imageFilter.getOriginalImage(); break; } imageLabel.setIcon(new ImageIcon(image)); } }); return button; } private static void createAndShowGui() throws IOException { JFrame frame = new JFrame("Image filter"); imageLabel.setIcon(new ImageIcon(imageFilter.getOriginalImage())); frame.getContentPane().add(imageLabel, BorderLayout.CENTER); JPanel buttonsPanel = new JPanel(new GridLayout(2, 3)); buttonsPanel.add(createImageFilterButton(FilterType.ORIGINAL)); buttonsPanel.add(createImageFilterButton(FilterType.GRAY)); buttonsPanel.add(createImageFilterButton(FilterType.BLUR)); buttonsPanel.add(createImageFilterButton(FilterType.SHARP)); buttonsPanel.add(createImageFilterButton(FilterType.EMBOSS)); frame.getContentPane().add(buttonsPanel, BorderLayout.SOUTH); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(500, 500); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) throws Exception { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { try { createAndShowGui(); } catch (IOException e) { e.printStackTrace(); } } }); } }class ImageFilter { private BufferedImage bufImage; public ImageFilter(String imagePath) { bufImage = imageToBufferedImage(new ImageIcon(imagePath).getImage()); } public BufferedImage getOriginalImage() { return bufImage; } public BufferedImage getSharpImage() { Kernel kernel = new Kernel(3, 3, new float[]{ -1, -1, -1, -1, 9, -1, -1, -1, -1 }); BufferedImageOp op = new ConvolveOp(kernel); return op.filter(bufImage, null); } public BufferedImage getBlurImage() { 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 op.filter(bufImage, null); } public BufferedImage getGrayImage() { ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY); ColorConvertOp op = new ColorConvertOp(cs, null); return op.filter(bufImage, null); } public BufferedImage getEmbossGrayImage() { Kernel kernel = new Kernel(3, 3, new float[]{ -2, 0, 0, 0, 1, 0, 0, 0, 2 }); BufferedImageOp op = new ConvolveOp(kernel); return op.filter(bufImage, null); } public BufferedImage getEmbossImage() { Kernel kernel = new Kernel(3, 3, new float[]{ 0, -1, 0, -1, 5, -1, 0, -1, 0 }); BufferedImageOp op = new ConvolveOp(kernel); return op.filter(bufImage, null); } /** * Convert the image to an buffered image. * @param image An instance of the class Image * @return An instance of the class BufferedImage that is converted from an image. */ public static BufferedImage imageToBufferedImage(Image image) { int width = image.getWidth(null); int height = image.getHeight(null); BufferedImage buf = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = buf.createGraphics(); g.drawImage(image, 0, 0, width, height, null); g.dispose(); return buf; } }
上述代码用eclipse直接导入报错啊。 java.lang.ExceptionInInitializerError Caused by: java.lang.IllegalArgumentException: Width (-1) and height (-1) cannot be <= 0 at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:999) at java.awt.image.BufferedImage.<init>(BufferedImage.java:312) at com.tur.demo.ImageFilter.imageToBufferedImage(ImageFilterTest.java:173) at com.tur.demo.ImageFilter.<init>(ImageFilterTest.java:107) at com.tur.demo.ImageFilterTest.<clinit>(ImageFilterTest.java:13) 求解释
可以的,生成二维码的时候有设置的, g.DrawImage(backgroundImg.Image, new System.Drawing.Rectangle(x, y, backgroundImg.Image.Width, backgroundImg.Image.Height), new System.Drawing.Rectangle(0, 0, backgroundImg.Image.Width, backgroundImg.Image.Height), GraphicsUnit.Pixel);
这有个简单的处理图像的程序,可以参考一下:
package com.tur.demo;import javax.swing.*;
import java.awt.*;
import java.awt.color.ColorSpace;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.*;
import java.io.IOException;public class ImageFilterTest {
private static ImageFilter imageFilter = new ImageFilter("/Users/Biao/Desktop/x.png");
private static JLabel imageLabel = new JLabel(); private static enum FilterType {
ORIGINAL("Original Image"),
GRAY("Gray Image"),
BLUR("Blur Image"),
SHARP("Sharp Image"),
EMBOSS("Emboss Image"); private String description; private FilterType(String description) {
this.description = description;
} @Override
public String toString() {
return description;
}
}; public static JButton createImageFilterButton(final FilterType type) {
JButton button = new JButton(type.toString()); button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
Image image = null; switch (type) {
case ORIGINAL:
image = imageFilter.getOriginalImage();
break;
case GRAY:
image = imageFilter.getGrayImage();
break;
case BLUR:
image = imageFilter.getBlurImage();
break;
case SHARP:
image = imageFilter.getSharpImage();
break;
case EMBOSS:
image = imageFilter.getEmbossImage();
break;
default:
image = imageFilter.getOriginalImage();
break;
} imageLabel.setIcon(new ImageIcon(image));
}
}); return button;
} private static void createAndShowGui() throws IOException {
JFrame frame = new JFrame("Image filter"); imageLabel.setIcon(new ImageIcon(imageFilter.getOriginalImage()));
frame.getContentPane().add(imageLabel, BorderLayout.CENTER); JPanel buttonsPanel = new JPanel(new GridLayout(2, 3));
buttonsPanel.add(createImageFilterButton(FilterType.ORIGINAL));
buttonsPanel.add(createImageFilterButton(FilterType.GRAY));
buttonsPanel.add(createImageFilterButton(FilterType.BLUR));
buttonsPanel.add(createImageFilterButton(FilterType.SHARP));
buttonsPanel.add(createImageFilterButton(FilterType.EMBOSS));
frame.getContentPane().add(buttonsPanel, BorderLayout.SOUTH); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} public static void main(String[] args) throws Exception {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
createAndShowGui();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}class ImageFilter {
private BufferedImage bufImage; public ImageFilter(String imagePath) {
bufImage = imageToBufferedImage(new ImageIcon(imagePath).getImage());
} public BufferedImage getOriginalImage() {
return bufImage;
} public BufferedImage getSharpImage() {
Kernel kernel = new Kernel(3, 3, new float[]{
-1, -1, -1,
-1, 9, -1,
-1, -1, -1
}); BufferedImageOp op = new ConvolveOp(kernel);
return op.filter(bufImage, null);
} public BufferedImage getBlurImage() {
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 op.filter(bufImage, null);
} public BufferedImage getGrayImage() {
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOp op = new ColorConvertOp(cs, null);
return op.filter(bufImage, null);
} public BufferedImage getEmbossGrayImage() {
Kernel kernel = new Kernel(3, 3, new float[]{
-2, 0, 0,
0, 1, 0,
0, 0, 2
}); BufferedImageOp op = new ConvolveOp(kernel);
return op.filter(bufImage, null);
} public BufferedImage getEmbossImage() {
Kernel kernel = new Kernel(3, 3, new float[]{
0, -1, 0,
-1, 5, -1,
0, -1, 0
}); BufferedImageOp op = new ConvolveOp(kernel);
return op.filter(bufImage, null);
} /**
* Convert the image to an buffered image.
* @param image An instance of the class Image
* @return An instance of the class BufferedImage that is converted from an image.
*/
public static BufferedImage imageToBufferedImage(Image image) {
int width = image.getWidth(null);
int height = image.getHeight(null); BufferedImage buf = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = buf.createGraphics();
g.drawImage(image, 0, 0, width, height, null);
g.dispose(); return buf;
}
}
java.lang.ExceptionInInitializerError
Caused by: java.lang.IllegalArgumentException: Width (-1) and height (-1) cannot be <= 0
at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:999)
at java.awt.image.BufferedImage.<init>(BufferedImage.java:312)
at com.tur.demo.ImageFilter.imageToBufferedImage(ImageFilterTest.java:173)
at com.tur.demo.ImageFilter.<init>(ImageFilterTest.java:107)
at com.tur.demo.ImageFilterTest.<clinit>(ImageFilterTest.java:13)
求解释
g.DrawImage(backgroundImg.Image, new System.Drawing.Rectangle(x, y, backgroundImg.Image.Width, backgroundImg.Image.Height),
new System.Drawing.Rectangle(0, 0, backgroundImg.Image.Width, backgroundImg.Image.Height),
GraphicsUnit.Pixel);