Java如何改变图片中图像的内容
项目中有图片是扫描存进服务器的,因为是手动扫描,所以图像中的表格相对图片就会有倾斜,因为我们的功能要将图片横向与垂直切割,所以如果其中的表格斜了的话就会把图片切坏,所以那些扫描不规正的的图片我们要将图片中的扫描内容旋转规正。请问在java中怎么来做啊?求高手。
我用过java的旋转,但是是将整个图片旋转了,是不对的,应该是图片不动,图片中的表格图像旋转正。这样能否用java实现?
这个难度太大了
[解决办法]
你这个相当于识别了啊研究一下模式匹配什么的很难了
[解决办法]
我觉得如果能做到这步,你就应该是很高手了吧...
首先即使不用计算机,而是手工把一个倾斜的图片恢复为横平竖直,也要根据图片的不同倾斜度来调整。
如果需要大脑来权衡的事情让计算机来做,那么计算机就要有一定的“知识“,知道什么是横的,什么是竖的,
知道什么是角度,怎么来调整。。。
这是不是就是传说中的人工智能AI........
不过,你可以问做图像分析、视频分析的人,怎么做.....
[解决办法]
可以实现,图像的尺寸大小位置不变,旋转整个图像内容,旋转时若原有尺寸处有没图像,则用透明色填充。
需要使用 Java2D 的仿射变换:AffineTransform
至于你的图像偏移了多少,自动匹配,跟旋转后的颜色填充,那就没办法了。必须手动调整。
给个例子:
package prx.swing.java2d;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
//图像旋转演示
public class RotateImageDemo extends JFrame {
/**
*
*/
private static final long serialVersionUID = 5590452310554415844L;
JSlider jSlider = new JSlider(JSlider.HORIZONTAL, 0, 180, 0); // 设定旋转角度
ImagePane imagePane = new ImagePane(); // 绘制图像的面板
public RotateImageDemo() {
super("图像旋转演示"); // 调用父类构造函数
jSlider.setPaintTicks(true); // 绘制标志位
jSlider.setMajorTickSpacing(45); // 设置标志尺寸
jSlider.setMinorTickSpacing(5);
jSlider.setPaintLabels(true); // 绘制出数字
jSlider.setBorder(new javax.swing.border.TitledBorder(BorderFactory
.createEmptyBorder(), "图像的旋转度")); // 设置边框
jSlider.addChangeListener(new ChangeListener() { // 滑动条jSlider事件处理
public void stateChanged(ChangeEvent ce) {
int value = ((JSlider) ce.getSource()).getValue(); // 获取设置值
double angle = (float) value / 180 * Math.PI; // 得到旋转角度(弧度制)
imagePane.ratoteImage((float) angle); // 旋转图像
}
});
Container container = getContentPane(); // 得到窗口容器
imagePane.setBackground(Color.GRAY);
imagePane.loadImage("1.jpg"); // 装载图片,图片和本类放在同一个目录下
container.add(imagePane, BorderLayout.CENTER); // 增加组件到容器上
container.add(jSlider, BorderLayout.SOUTH);
setSize(500, 500); // 设置窗口尺寸
setVisible(true); // 设置窗口可视
setLocationRelativeTo(null); //居中
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 关闭窗口时退出程序
}
public static void main(String[] args) {
new RotateImageDemo();
}
class ImagePane extends JPanel {
/**
*
*/
private static final long serialVersionUID = 5397776194796791122L;
Image image;
BufferedImage bufImage; // 用于显示的缓冲区图像
BufferedImage originalBufImage; // 原始缓冲区图像
Graphics2D bufImageG; // 缓冲区图像的图形环境
public void loadImage(String fileName) {
image = this.getToolkit().getImage(getClass().getResource(fileName)); // 取得图像
MediaTracker mt = new MediaTracker(this); // 实例化媒体加载器
mt.addImage(image, 0); // 增加图像到加载器中
try {
mt.waitForAll(); // 等待图片加载
} catch (Exception ex) {
ex.printStackTrace(); // 输出出错信息
}
originalBufImage = new BufferedImage(image.getWidth(this), image
.getHeight(this), BufferedImage.TYPE_INT_ARGB); // 创建原始缓冲区图像
bufImage = originalBufImage;
bufImageG = bufImage.createGraphics(); // 创建bufImage的图形环境
bufImageG.drawImage(image, 0, 0, this); // 传输源图像数据到缓冲区图像中
repaint(); // 重绘组件
}
// 过滤图像
public void ratoteImage(double angle) {
if (bufImage == null)
return; // 如果bufImage为空则直接返回
BufferedImage filteredBufImage = new BufferedImage(image .getWidth(this), image.getHeight(this), BufferedImage.TYPE_INT_ARGB); // 过滤后的图像
AffineTransform transform = new AffineTransform(); // 仿射变换对象
transform.rotate(angle, image.getWidth(this)/2, image.getHeight(this)/2); // 以图像中心为原点,旋转图像
AffineTransformOp imageOp = new AffineTransformOp(transform, null);// 创建仿射变换操作对象
imageOp.filter(originalBufImage, filteredBufImage);// 过滤图像,目标图像在filteredBufImage
bufImage = filteredBufImage; // 让用于显示的缓冲区图像指向过滤后的图像
repaint(); // 重绘组件
}
// 重载容器的paintComponent()方法
public void paint(Graphics g) {
super.paintComponent(g);
if (bufImage != null) {
Graphics2D g2 = (Graphics2D) g;
g2.drawImage(bufImage, this.getWidth()/2 - bufImage.getWidth()/2, this.getHeight()/2 - bufImage.getHeight()/2, this); // 绘制图片
}
}
}
}
运行效果图:
[img=http://b61.photo.store.qq.com/http_imgload.cgi?/rurl4_b=04189a65e7dcc9b139563a6ef10991b6675c069ff240c9ce36d6577906d1d91bc2f130b5aca4005ee5ed0f73a72834b28b6ad5d6a1b4930da725f99791f6be02560090c1e1ea2253e8e62ce89f303791a6a418d9&a=67&b=61][/img]
[img=http://b70.photo.store.qq.com/http_imgload.cgi?/rurl4_b=04189a65e7dcc9b139563a6ef10991b6805a3df1680f78c7b8d665468fb048d6c5eb6e285606e557106229cdb1ef8759f076de287b2c766e81ad5dee332681ac3d8acb7fe4cf1122c98a69fa124942d892d2ed37&a=61&b=70][/img]
[img=http://b70.photo.store.qq.com/http_imgload.cgi?/rurl4_b=04189a65e7dcc9b139563a6ef10991b642df0b531b5de17f87de75f5a939ae675893c2a9749be41d17bd6cf99f35397cec798041f1702a0eda04408fe363c49df0a90e507a2f08cc57d7788b31f605976fd567b8&a=67&b=70][/img]
