最近在弄图像的东西,可以归纳一下对图像的一些用法:
1.镜像
bi 是我面板上获得的图像,biMirror 是我镜像之后的图像
2.旋转
if (isInit) {
BufferedImage bi = thumbViewPane.getBufferImage();
if (bi == null) {
return;
}
int nIndex = rotateList.getSelectedIndex();
// 对Java来说,旋转方向为顺时针方向
int nNewAngle = 0;
switch (nIndex) {
case 0:
nNewAngle = 0;
break;
case 1:
nNewAngle = 270;
break;
case 2:
nNewAngle = 180;
break;
case 3:
nNewAngle = 90;
break;
}
if (nNewAngle == nAngle) {
return;
}
int nWidth = bi.getWidth();
int nHeight = bi.getHeight();
int nRotateAngle = 0;
if (nAngle == 0) {
nRotateAngle = nNewAngle;
} else {
if (nNewAngle > nAngle) {
nRotateAngle = nNewAngle - nAngle;
} else {
nRotateAngle = 360 - (nAngle - nNewAngle);
}
}
nRadian = Math.toRadians(nRotateAngle);
// 以图像的中心为旋转点
AffineTransform transform = null;
int nNewWidth = nWidth;
int nNewHeight = nHeight;
if (nRotateAngle == 90 || nRotateAngle == 270) {
nNewWidth = nHeight;
nNewHeight = nWidth;
transform = AffineTransform.getRotateInstance(nRadian);
if (nRotateAngle == 90) {
transform.translate(0, -nHeight);
} else {
transform.translate(-nWidth, 0);
}
} else {
transform = AffineTransform.getRotateInstance(nRadian,
nWidth / 2, nHeight / 2);
}
BufferedImage biMirror = new BufferedImage(nNewWidth, nNewHeight,
BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = biMirror.createGraphics();
g2d.drawRenderedImage(bi, transform);
thumbViewPane.setBufferImage(biMirror);
// after image manipulation, call the garbage collector
System.gc();
nAngle = nNewAngle;
}
3.放大或缩小
在实现中,是新建了一个放大和缩小的按钮,如果点击了按钮,然后点击图像就可以在当前的图像大小的基础下放大一定的比例。 在鼠标监听事件中写的放大和缩小的函数。
public void mouseClicked(MouseEvent e) {
int i = e.getButton();
if (i == MouseEvent.BUTTON1) {
if (previewFrame.iszoomin == true
&& ((previewFrame.zoomclickcount < 1) && (-4 < previewFrame.zoomclickcount))) {
BufferedImage tempimg = previewFrame.bitemp;
BufferedImage bi = previewFrame.bitemp;
if (bi == null) {
return;
}
int nIndex = previewFrame.rotateList.getSelectedIndex();
// 对Java来说,旋转方向为顺时针方向
int nNewAngle = 0;
switch (nIndex) {
case 0:
nNewAngle = 0;
break;
case 1:
nNewAngle = 270;
break;
case 2:
nNewAngle = 180;
break;
case 3:
nNewAngle = 90;
break;
}
int nWidth = bi.getWidth();
int nHeight = bi.getHeight();
double nRadian = Math.toRadians(nNewAngle);
// 以图像的中心为旋转点
AffineTransform transform = null;
int nNewWidth = nWidth;
int nNewHeight = nHeight;
if (nNewAngle == 90 || nNewAngle == 270) {
nNewWidth = nHeight;
nNewHeight = nWidth;
transform = AffineTransform.getRotateInstance(nRadian);
if (nNewAngle == 90) {
transform.translate(0, -nHeight);
} else {
transform.translate(-nWidth, 0);
}
} else {
transform = AffineTransform.getRotateInstance(nRadian,
nWidth / 2, nHeight / 2);
}
BufferedImage biMirror = new BufferedImage(nNewWidth,
nNewHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = biMirror.createGraphics();
g2d.drawRenderedImage(bi, transform);
setBufferImage(biMirror);
previewFrame.zoomclickcount++;
int x = e.getX();
int y = e.getY();
AffineTransformOp op;
if (previewFrame.zoomclickcount > 0) {
op = new AffineTransformOp(AffineTransform
.getScaleInstance(Math.pow(2.0,
previewFrame.zoomclickcount), Math.pow(
2.0, previewFrame.zoomclickcount)),
null);
} else if (previewFrame.zoomclickcount == 0) {
op = new AffineTransformOp(AffineTransform
.getScaleInstance(Math.pow(2.0, 0), Math.pow(
2.0, 0)), null);
} else {
op = new AffineTransformOp(AffineTransform
.getScaleInstance(Math.pow(2.0,
previewFrame.zoomclickcount), Math.pow(
2.0, previewFrame.zoomclickcount)),
null);
}
Image Itemp = op.filter(biMirror, null);
// 以图像的中心为旋转点
setBufferImage((BufferedImage) Itemp);
int imgwidth = tempimg.getWidth() / 2;
int imghight = tempimg.getHeight() / 2;
int offsetw = 2 * (x - imgwidth);
int offseth = 2 * (y - imghight);
Point p = new Point((tempimg.getWidth()) + offsetw - 300,
(tempimg.getHeight()) + offseth - 500);
scroller.getViewport().setViewSize(
new Dimension(tempimg.getWidth() * 2, tempimg
.getHeight() * 2));
scroller.getViewport().setViewPosition(p);
setCursor(zoomincursor);
System.gc();
} else if (previewFrame.iszoomout == true
&& ((previewFrame.zoomclickcount < 2) && (-3 < previewFrame.zoomclickcount))) {
BufferedImage tempimg = previewFrame.bitemp;
BufferedImage bi = previewFrame.bitemp;
if (bi == null) {
return;
}
int nIndex = previewFrame.rotateList.getSelectedIndex();
// 对Java来说,旋转方向为顺时针方向
int nNewAngle = 0;
switch (nIndex) {
case 0:
nNewAngle = 0;
break;
case 1:
nNewAngle = 270;
break;
case 2:
nNewAngle = 180;
break;
case 3:
nNewAngle = 90;
break;
}
int nWidth = bi.getWidth();
int nHeight = bi.getHeight();
double nRadian = Math.toRadians(nNewAngle);
// 以图像的中心为旋转点
AffineTransform transform = null;
int nNewWidth = nWidth;
int nNewHeight = nHeight;
if (nNewAngle == 90 || nNewAngle == 270) {
nNewWidth = nHeight;
nNewHeight = nWidth;
transform = AffineTransform.getRotateInstance(nRadian);
if (nNewAngle == 90) {
transform.translate(0, -nHeight);
} else {
transform.translate(-nWidth, 0);
}
} else {
transform = AffineTransform.getRotateInstance(nRadian,
nWidth / 2, nHeight / 2);
}
BufferedImage biMirror = new BufferedImage(nNewWidth,
nNewHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = biMirror.createGraphics();
g2d.drawRenderedImage(bi, transform);
setBufferImage(biMirror);
previewFrame.zoomclickcount--;
int x = e.getX();
int y = e.getY();
AffineTransformOp op;
if (previewFrame.zoomclickcount < 0) {
op = new AffineTransformOp(AffineTransform
.getScaleInstance(Math.pow(2.0,
previewFrame.zoomclickcount), Math.pow(
2.0, previewFrame.zoomclickcount)),
null);
} else if (previewFrame.zoomclickcount == 0) {
op = new AffineTransformOp(AffineTransform
.getScaleInstance(Math.pow(2.0, 0), Math.pow(
2.0, 0)), null);
} else {
op = new AffineTransformOp(AffineTransform
.getScaleInstance(Math.pow(2.0,
previewFrame.zoomclickcount), Math.pow(
2.0, previewFrame.zoomclickcount)),
null);
}
Image Itemp = op.filter(biMirror, null);
setBufferImage((BufferedImage) Itemp);
int imgwidth = tempimg.getWidth() / 2;
int imghight = tempimg.getHeight() / 2;
int offsetw = 2 * (x - imgwidth);
int offseth = 2 * (y - imghight);
Point p = new Point((tempimg.getWidth()) + offsetw, tempimg
.getHeight()
+ offseth);
scroller.getViewport().setViewPosition(p);
setCursor(zoomoutcursor);
System.gc();
} else if (previewFrame.isMove == true) {
setCursor(new Cursor(Cursor.HAND_CURSOR));
}
else {
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
}
repaint();
}
还有图像的切割,图像的擦除,图像的合并等等,这些有兴趣的可以私聊我。嘿嘿。