如何用Java实现图形的放大和缩小

Python014

如何用Java实现图形的放大和缩小,第1张

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)

得到一张缩放后的新图。