java图片裁剪原理

java图片裁剪原理,第1张

总体思想

前台网页用js得到裁剪图片的id及x y 宽度和高度

服务端根据id取出要裁剪的图片

根据这些参数来生成裁剪的图像 后台代码如下

java 代码

package wodexiangce

import java awt Rectangle

import java awt image BufferedImage

import java io File

import java io FileInputStream

import java io IOException

import java util Iterator

import javax imageio ImageIO

import javax imageio ImageReadParam

import javax imageio ImageReader

import javax imageio stream ImageInputStream

/**

*

*

*

*/

public class OperateImage {

// ===源图片路径名称如 c:\ jpg

private String srcpath

// ===剪切图片存放路径名称 如 c:\ jpg

private String subpath

// ===剪切点x坐标

private int x

private int y

// ===剪切点宽度

private int width

private int height

public OperateImage() {

}

public OperateImage( int x int y int width int height) {

this x = x

this y = y

this width = width

this height = height

}

/**

* 对图片裁剪 并把裁剪完蛋新图片保存

*/

public void cut() throws IOException {

FileInputStream is = null

ImageInputStream iis = null

try {

// 读取图片文件

is = new FileInputStream(srcpath)

/*

* 返回包含所有当前已注册 ImageReader 的 Iterator 这些 ImageReader

* 声称能够解码指定格式 参数 formatName 包含非正式格式名称

*(例如 jpeg 或 tiff )等

*/

Iterator <ImageReader >it = ImageIO getImageReadersByFormatName( jpg )

ImageReader reader = it next()

// 获取图片流

iis = ImageIO createImageInputStream(is)

/*

* <p>iis:读取源 true:只向前搜索 </p>将它标记为 只向前搜索

* 此设置意味着包含在输入源中的图像将只按顺序读取 可能允许 reader

* 避免缓存包含与以前已经读取的图像关联的数据的那些输入部分

*/

reader setInput(iis true )

/*

* <p>描述如何对流进行解码的类<p>用于指定如何在输入时从 Java Image I/O

* 框架的上下文中的流转换一幅图像或一组图像 用于特定图像格式的插件

* 将从其 ImageReader 实现的 getDefaultReadParam 方法中返回

* ImageReadParam 的实例

*/

ImageReadParam param = reader getDefaultReadParam()

/*

* 图片裁剪区域 Rectangle 指定了坐标空间中的一个区域 通过 Rectangle 对象

* 的左上顶点的坐标(x y) 宽度和高度可以定义这个区域

*/

Rectangle rect = new Rectangle(x y width height)

// 提供一个 BufferedImage 将其用作解码像素数据的目标

param setSourceRegion(rect)

/*

* 使用所提供的 ImageReadParam 读取通过索引 imageIndex 指定的对象 并将

* 它作为一个完整的 BufferedImage 返回

*/

BufferedImage bi = reader read( param)

// 保存新图片

ImageIO write(bi jpg new File(subpath))

} finally {

if (is != null )

is close()

if (iis != null )

iis close()

}

}

public int getHeight() {

return height

}

public void setHeight( int height) {

this height = height

}

public String getSrcpath() {

return srcpath

}

public void setSrcpath(String srcpath) {

this srcpath = srcpath

}

public String getSubpath() {

return subpath

}

public void setSubpath(String subpath) {

this subpath = subpath

}

public int getWidth() {

return width

}

public void setWidth( int width) {

this width = width

}

public int getX() {

return x

}

public void setX( int x) {

this x = x

}

public int getY() {

return y

}

public void setY( int y) {

this y = y

}

public static void main(String[] args) throws Exception {

String name = d:\ jpg

OperateImage o = new OperateImage( )

o setSrcpath(name)

o setSubpath( D:\ jpg )

o cut()

}

lishixinzhi/Article/program/Java/hx/201311/26771

Java提供两种类型的剪贴板:系统的和本地的.

本地剪贴板只在当前虚拟机中有效.Java允许多个本地剪贴板同时存在,可以方便地通过剪贴板的名称来进行存取访问.

系统剪贴板与同等 *** 作系统直接关连,允许应用程序与运行在该 *** 作系统下的其它程序之间进行信息交换.

在进一步深入之前,先看看与剪贴板相同的java类,这些类主要包含在java.awt.datatransfer包中,主要有以下几种:

Clipboard类: 此类实现一种使用剪切/复制/粘贴 *** 作传输数据的机制.

ClipboardOwner接口: 任何处理剪贴板的类都必须实现该接口.该接口用于剪贴板中的原始数据被替换时发出通知.

Dataflavor类: 提供有关数据的元信息,通常用于访问剪切板上的数据。

Transferable接口: 为传输 *** 作提供数据所使用的类的接口

StringSelection类: 实现传输String所需能力的Transferable

Clipboard类:方法

1.String getName()返回剪切板对象的名字

2.setContents(Transferable contents,ClipOwner owner)

讲剪切板的内容设置到指定的Transferable对象,并将指定的剪切板所有者作为新内容的所有者注册

3.Transferable getContents(null)

返回表示剪贴板当前内容的 transferable 对象。无则null

4.DataFlavor[] getAvailableDataFlavors()

返回 DataFlavor 的数组,其中提供了此剪贴板的当前内容。无则null

5.boolean isDataFlavorAvailable(DataFlavor flavor)

返回是否能够以指定的 DataFlavor 形式提供此剪贴板的当前内容。

6.Object getData(DataFlavor flavor)

返回一个对象,表示此剪贴板中指定 DataFlavor 类型的当前内容。

Transferable接口:

属性:

1.stringFlavor:字符串数据

2.imageFlavor:图片数据

方法:

1.Object getTransferData(DataFlavor flavor)

返回一个对象,该对象表示将要被传输的数据。

2.DataFlavorgetTransferDataFlavors()

返回 DataFlavor 对象的数组,指示可用于提供数据的 flavor。

3.boolean isDataFlavorSupported(DataFlavor flavor)

返回此对象是否支持指定的数据 flavor。

例子:1.往剪切板里面写文本数据

Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard()

Transferable trandata = new StringSelection("4654654")

clipboard.setContents(trandata, null)

2.获取剪切板中的内容(文本数据)

Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard()

Transferable clipT = clipboard.getContents(null)

//获取文本中的Transferable对象

if(clipT!=null){

if(clipT.isDataFlavorSupported(DataFlavor.stringFlavor))

//判断内容是否为文本类型stringFlavor

return (String)clipT.getTransferData(DataFlavor.stringFlavor)

//返回指定flavor类型的数据


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/tougao/11790767.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-18
下一篇2023-05-18

发表评论

登录后才能评论

评论列表(0条)

    保存