java实现图形的放大和缩小,其实就是在画图时,改变图片的长和宽。以下代码参考一下:
import java.awt.Graphics
import java.awt.MouseInfo
import java.awt.Point
import java.awt.event.ActionEvent
import java.awt.event.ActionListener
import java.awt.event.MouseEvent
import java.awt.event.MouseListener
import java.io.File
import javax.swing.ImageIcon
import javax.swing.JButton
import javax.swing.JFileChooser
import javax.swing.JFrame
import javax.swing.JPanel
import javax.swing.filechooser.FileNameExtensionFilter
public class App extends JFrame implements MouseListener, ActionListener {
int x = 0
int y = 0
File[] selectedFiles = null
int fileIndex = 0
int width = 200
int height = 200
public App() {
setDefaultCloseOperation(EXIT_ON_CLOSE)
setLocationRelativeTo(null)
setSize(400, 300)
setResizable(false)
getContentPane().setLayout(null)
JPanel panel = new ImagePanel()
panel.setBounds(12, 40, 370, 218)
getContentPane().add(panel)
addMouseListener(this)
JButton btnBrowse = new JButton("Browse")
btnBrowse.addActionListener(this)
btnBrowse.setBounds(12, 9, 91, 21)
getContentPane().add(btnBrowse)
setVisible(true)
}
public static void main(String[] args) {
new App()
}
public void actionPerformed(ActionEvent e) {
JFileChooser chooser = new JFileChooser()
chooser.setMultiSelectionEnabled(true)
FileNameExtensionFilter filter = new FileNameExtensionFilter(
"JPG & GIF Images", "jpg", "gif")
// 设置文件类型
chooser.setFileFilter(filter)
// 打开选择器面板
int returnVal = chooser.showOpenDialog(this)
if (returnVal == JFileChooser.APPROVE_OPTION) {
selectedFiles = chooser.getSelectedFiles()
repaint()
}
}
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
Point point = MouseInfo.getPointerInfo().getLocation()
x = point.x
y = point.y
}
public void mouseReleased(MouseEvent e) {
Point point = MouseInfo.getPointerInfo().getLocation()
int thisX = point.x
int thisY = point.y
System.out.println("thisX=" + thisX + " " + "thisY=" + thisY)
if ((y - thisY < 20 && y - thisY > 0)
|| (y - thisY < 0 && y - thisY > -20)) {
// Y 在20范围内移动认为是水平移动
if (x < thisX) {
// right
if (selectedFiles != null
&& fileIndex < selectedFiles.length - 1) {
fileIndex++
}
} else {
// left
if (selectedFiles != null && fileIndex > 0) {
fileIndex--
}
}
} else {
if (x < thisX) {
// 右下
width += 20
height += 20
} else {
// 左上
width -= 20
height -= 20
}
}
repaint()
}
class ImagePanel extends JPanel {
public void paint(Graphics g) {
super.paint(g)
if (selectedFiles != null) {
ImageIcon icon = new ImageIcon(selectedFiles[fileIndex]
.getPath())
g.drawImage(icon.getImage(), 0, 0, width, height, this)
}
}
}
}
也就是图片压缩,可以不修改任何大小的压缩(速度快),也可等比例修改大小压缩(较慢)下面这是一段等比例缩小图片的方法。
public String compressPic(String inputDir, String outputDir,
String inputFileName, String outputFileName, int width,
int height, boolean gp,String hzm) {
try {
if (!image.exists()) {
return ""
}
Image img = ImageIO.read(image)
// 判断图片格式是否正确
if (img.getWidth(null) == -1) {
return "no"
} else {
int newWidthint newHeight
// 判断是否是等比缩放
if (gp == true) {
// 为等比缩放计算输出的图片宽度及高度
double rate1 = ((double) img.getWidth(null)) / (double) width
double rate2 = ((double) img.getHeight(null)) / (double) height
// 根据缩放比率大的进行缩放控制
double rate = rate1 >rate2 ? rate1 : rate2
newWidth = (int) (((double) img.getWidth(null)) / rate)
newHeight = (int) (((double) img.getHeight(null)) / rate)
} else {
newWidth = img.getWidth(null)// 输出的图片宽度
newHeight = img.getHeight(null)// 输出的图片高度
}
BufferedImage tag = new BufferedImage((int) newWidth, (int) newHeight, BufferedImage.TYPE_INT_RGB)
/*
* Image.SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的
* 优先级比速度高 生成的图片质量比较好 但速度慢
*/
Image im = img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH)
tag.getGraphics().drawImage(im, 0, 0, null)
FileOutputStream out = new FileOutputStream(outputDir + outputFileName)
//JPEGImageEncoder可适用于其他图片类型的转换
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out)
encoder.encode(tag)
out.close()
}
} catch (IOException ex) {
ex.printStackTrace()
}
return "ok"
}
放大图像不会导致失真,而缩小图像将不可避免的失真。Java中也同样是这样。
但java提供了4个缩放的微调选项。
image.SCALE_SMOOTH
//平滑优先
image.SCALE_FAST//速度优先
image.SCALE_AREA_AVERAGING
//区域均值
image.SCALE_REPLICATE
//像素复制型缩放
image.SCALE_DEFAULT
//默认缩放模式
调用方法
Image
new_img=old_img.getScaledInstance(1024,
768,
Image.SCALE_SMOOTH)
得到一张缩放后的新图。