JAVA实现图片旋转的一个很好的例子
- 格式:pdf
- 大小:124.91 KB
- 文档页数:3
import java.awt.Color;import java.awt.Graphics2D;import java.awt.Transparency;import java.awt.geom.AffineTransform;import java.awt.image.AffineTransformOp;import java.awt.image.BufferedImage;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.IOException;import java.io.InputStream;import javax.imageio.ImageIO;import javax.imageio.stream.ImageOutputStream;public class Test1{public static BufferedImage rotateImg(BufferedImage image, int degree, Color bgcolor) throws IOException {int iw = image.getWidth();//原始图象的宽度int ih = image.getHeight();//原始图象的高度int w = 0;int h = 0;int x = 0;int y = 0;degree = degree % 360;if (degree < 0)degree = 360 + degree;//将角度转换到0-360度之间double ang = Math.toRadians(degree);//将角度转为弧度/***确定旋转后的图象的高度和宽度*/if (degree == 180 || degree == 0 || degree == 360){w = iw;h = ih;} else if (degree == 90 || degree == 270){w = ih;h = iw;} else {int d = iw + ih;w = (int) (d * Math.abs(Math.cos(ang)));h = (int) (d * Math.abs(Math.sin(ang)));}x = (w / 2) - (iw / 2);//确定原点坐标y = (h / 2) - (ih / 2);BufferedImage rotatedImage = new BufferedImage(w, h, image.getType());Graphics2D gs = (Graphics2D)rotatedImage.getGraphics();if(bgcolor==null){rotatedImage = gs.getDeviceConfiguration().createCompatibleImage(w, h, Transparency.TRANSLUCENT);}else{gs.setColor(bgcolor);gs.fillRect(0, 0, w, h);//以给定颜色绘制旋转后图片的背景}AffineTransform at = new AffineTransform();at.rotate(ang, w / 2, h / 2);//旋转图象at.translate(x, y);AffineTransformOp op = new AffineTransformOp(at, AffineTransformOp.TYPE_BICUBIC);op.filter(image, rotatedImage);image = rotatedImage;// ByteArrayOutputStream byteOut= new ByteArrayOutputStream();// ImageOutputStream iamgeOut = ImageIO.createImageOutputStream(byteOut);// ImageIO.write(image, "png", iamgeOut);ImageIO.write(image, "png", new File("E:\\222.png"));// InputStream inputStream = new ByteArrayInputStream(byteOut.toByteArray());return image;}}。
Java实现图⽚旋转、指定图像⼤⼩和⽔平翻转本⽂实例为⼤家分享了Java实现图⽚旋转、指定图像⼤⼩、⽔平翻转,供⼤家参考,具体内容如下package com.zeph.j2se.image;import java.awt.Graphics2D;import java.awt.RenderingHints;import java.awt.image.BufferedImage;public class ImageOperate {/*** 旋转图⽚为指定⾓度** @param bufferedimage* ⽬标图像* @param degree* 旋转⾓度* @return*/public static BufferedImage rotateImage(final BufferedImage bufferedimage,final int degree) {int w = bufferedimage.getWidth();int h = bufferedimage.getHeight();int type = bufferedimage.getColorModel().getTransparency();BufferedImage img;Graphics2D graphics2d;(graphics2d = (img = new BufferedImage(w, h, type)).createGraphics()).setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);graphics2d.rotate(Math.toRadians(degree), w / 2, h / 2);graphics2d.drawImage(bufferedimage, 0, 0, null);graphics2d.dispose();return img;}/*** 变更图像为指定⼤⼩** @param bufferedimage* ⽬标图像* @param w* 宽* @param h* ⾼* @return*/public static BufferedImage resizeImage(final BufferedImage bufferedimage,final int w, final int h) {int type = bufferedimage.getColorModel().getTransparency();BufferedImage img;Graphics2D graphics2d;(graphics2d = (img = new BufferedImage(w, h, type)).createGraphics()).setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);graphics2d.drawImage(bufferedimage, 0, 0, w, h, 0, 0,bufferedimage.getWidth(), bufferedimage.getHeight(), null);graphics2d.dispose();return img;}/*** ⽔平翻转图像** @param bufferedimage* ⽬标图像* @return*/public static BufferedImage flipImage(final BufferedImage bufferedimage) {int w = bufferedimage.getWidth();int h = bufferedimage.getHeight();BufferedImage img;Graphics2D graphics2d;(graphics2d = (img = new BufferedImage(w, h, bufferedimage.getColorModel().getTransparency())).createGraphics()).drawImage(bufferedimage, 0, 0, w, h, w, 0, 0, h, null);graphics2d.dispose();return img;}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
Java图⽚处理开源框架Thumbnailator图⽚处理是当今软件开发中⾮常重要的⼀环,然⽽处理图⽚的开源框架却并不多。
现⾦⽹上流传的Java处理图⽚的代码,虽然可对图⽚进⾏简单处理,但效果并不理想。
虽然也有些其他解决⽅案,但都摆脱不了繁琐,使⽤起来⼗分不⽅便。
为了解决这个问题,我也是在⽹上找了好久,看了很多资料,功夫不负有⼼⼈,最终找到了⼀个处理图⽚⼗分棒的开源框架。
特此拿出来与⼤家分享。
Thumbnailator 是⼀个优秀的图⽚处理的Google开源Java类库。
处理效果远⽐Java API的好。
从API提供现有的图像⽂件和图像对象的类中简化了处理过程,两三⾏代码就能够从现有图⽚⽣成处理后的图⽚,且允许微调图⽚的⽣成⽅式,同时保持了需要写⼊的最低限度的代码量。
还⽀持对⼀个⽬录的所有图⽚进⾏批量处理操作。
⽀持的处理操作:图⽚缩放,区域裁剪,⽔印,旋转,保持⽐例。
另外值得⼀提的是,Thumbnailator⾄今仍不断更新,怎么样,感觉很有保障吧!下⾯我们介绍下如何使⽤Thumbnailator原图:1、指定⼤⼩进⾏缩放//size(宽度, ⾼度)/** 若图⽚横⽐200⼩,⾼⽐300⼩,不变* 若图⽚横⽐200⼩,⾼⽐300⼤,⾼缩⼩到300,图⽚⽐例不变* 若图⽚横⽐200⼤,⾼⽐300⼩,横缩⼩到200,图⽚⽐例不变* 若图⽚横⽐200⼤,⾼⽐300⼤,图⽚按⽐例缩⼩,横为200或⾼为300*/Thumbnails.of("images/a380_1280x1024.jpg").size(200, 300).toFile("c:/a380_200x300.jpg");Thumbnails.of("images/a380_1280x1024.jpg").size(2560, 2048).toFile("c:/a380_2560x2048.jpg");2、按照⽐例进⾏缩放//scale(⽐例)Thumbnails.of("images/a380_1280x1024.jpg").scale(0.25f).toFile("c:/a380_25%.jpg");Thumbnails.of("images/a380_1280x1024.jpg").scale(1.10f).toFile("c:/a380_110%.jpg");3、不按照⽐例,指定⼤⼩进⾏缩放//keepAspectRatio(false)默认是按照⽐例缩放的Thumbnails.of("images/a380_1280x1024.jpg").size(200,200).keepAspectRatio(false).toFile("c:/a380_200x200.jpg");4、旋转//rotate(⾓度),正数:顺时针负数:逆时针Thumbnails.of("images/a380_1280x1024.jpg").size(1280,1024).rotate(90).toFile("c:/a380_rotate+90.jpg");Thumbnails.of("images/a380_1280x1024.jpg").size(1280,1024).rotate(-90).toFile("c:/a380_rotate-90.jpg");5、⽔印//watermark(位置,⽔印图,透明度)Thumbnails.of("images/a380_1280x1024.jpg").size(1280,1024).watermark(Positions.BOTTOM_RIGHT,ImageIO.read(newFile("images/watermark.png")),0.5f) .outputQuality(0.8f).toFile("c:/a380_watermark_bottom_right.jpg");Thumbnails.of("images/a380_1280x1024.jpg").size(1280,1024).watermark(Positions.CENTER,ImageIO.read(newFile("images/watermark.png")),0.5f).outputQuality(0.8f).toFile("c:/a380_watermark_center.jpg");6、裁剪//sourceRegion()//图⽚中⼼400*400的区域Thumbnails.of("images/a380_1280x1024.jpg").sourceRegion(Positions.CENTER,400,400).size(200,200).keepAspectRatio(false).toFile("c:/a380_region_center.jpg");//图⽚右下400*400的区域Thumbnails.of("images/a380_1280x1024.jpg").sourceRegion(Positions.BOTTOM_RIGHT,400,400).size(200,200).keepAspectRatio(false).toFile("c:/a380_region_bootom_right.jpg");//指定坐标Thumbnails.of("images/a380_1280x1024.jpg").sourceRegion(600,500,400,400).size(200,200).keepAspectRatio(false).toFile("c:/a380_region_coord.jpg");7、转化图像格式//outputFormat(图像格式)Thumbnails.of("images/a380_1280x1024.jpg").size(1280,1024).outputFormat("png").toFile("c:/a380_1280x1024.png");Thumbnails.of("images/a380_1280x1024.jpg").size(1280,1024).outputFormat("gif").toFile("c:/a380_1280x1024.gif");8、输出到OutputStream//toOutputStream(流对象)OutputStreamos=newFileOutputStream("c:/a380_1280x1024_OutputStream.png"); Thumbnails.of("images/a380_1280x1024.jpg").size(1280,1024).toOutputStream(os);9、输出到BufferedImage//asBufferedImage()返回BufferedImageBufferedImagethumbnail=Thumbnails.of("images/a380_1280x1024.jpg").size(1280,1024).asBufferedImage();ImageIO.write(thumbnail,"jpg",newFile("c:/a380_1280x1024_BufferedImage.jpg"));以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
java后台解决上传图⽚翻转90的问题,有demo,经过测试可⽤1.需要加⼊依赖metadata-extractor.jar依赖如下<dependencies><!-- Extracts Exif, IPTC, XMP, ICC and other metadata from image and video files(从图像和视频⽂件中提取EXIF、IPTC、XMP、ICC和其他元数据) --><dependency><groupId>com.drewnoakes</groupId><artifactId>metadata-extractor</artifactId><version>2.11.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>2.主要看⼯具类,ImageUtil,因为是mvc上传图⽚,所以之前参数我参考别⼈代码改了⼀下.package com.huarui.util;import java.awt.Dimension;import java.awt.Graphics2D;import java.awt.Rectangle;import java.awt.RenderingHints;import java.awt.image.BufferedImage;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.util.HashMap;import java.util.Map;import javax.imageio.ImageIO;import com.drew.imaging.ImageMetadataReader;import com.drew.imaging.ImageProcessingException;import com.drew.metadata.Directory;import com.drew.metadata.Metadata;import com.drew.metadata.Tag;public class ImageUtil {public static Map<String, Object> getExif(InputStream inputStream) {Map<String, Object> map = new HashMap<String, Object>();try {Metadata metadata = ImageMetadataReader.readMetadata(inputStream);map = printExif(metadata);} catch (ImageProcessingException e) {System.out.println(e.getMessage());} catch (IOException e) {System.out.println(e.getMessage());}return map;}// 获取exif信息,将旋转⾓度信息拿到private static Map<String, Object> printExif(Metadata metadata) {Map<String, Object> map = new HashMap<String, Object>();String tagName = null;String desc = null;for (Directory directory : metadata.getDirectories()) {for (Tag tag : directory.getTags()) {tagName = tag.getTagName();desc = tag.getDescription();if (tagName.equals("Orientation")) {map.put("Orientation", desc);}}}return map;}public static int getAngle(Map<String, Object> map) {int ro = 0;if(map.get("Orientation")!=null) {String ori = map.get("Orientation").toString();if (ori.indexOf("90") >= 0) {ro = 1;} else if (ori.indexOf("180") >= 0) {ro = 2;} else if (ori.indexOf("270") >= 0) {ro = 3;}}return ro;}public static BufferedImage getBufferedImg(BufferedImage src,int width, int height, int ro) {int angle = (int) (90 * ro);int type = src.getColorModel().getTransparency();int wid = width;int hei = height;if (ro % 2 != 0) {int temp = width;width = height;height = temp;}Rectangle re = new Rectangle(new Dimension(width, height));BufferedImage BfImg = null;BfImg = new BufferedImage(re.width, re.height, type);Graphics2D g2 = BfImg.createGraphics();g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g2.rotate(Math.toRadians(angle), re.width / 2,re.height / 2);g2.drawImage(src, (re.width - wid) / 2, (re.height - hei) / 2, null);g2.dispose();return BfImg;}//获得图⽚的⾼public static int getHeight(InputStream is) {BufferedImage src = null;int height = -1;try {src = ImageIO.read(is);height = src.getHeight();} catch (Exception e) {System.out.println(e.getMessage());}return height;}//获得图⽚的宽public static int getWidth(InputStream is) {BufferedImage src = null;int width = -1;try {src = ImageIO.read(is);width = src.getWidth();} catch (Exception e) {System.out.println(e.getMessage());}return width;}}3.Ctrollerpackage com.huarui.action;import com.huarui.util.ImageUtil;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.multipart.MultipartFile;import javax.imageio.ImageIO;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;@Controllerpublic class UploadController {@RequestMapping("/upload")public @ResponseBody String fileUpload(MultipartFile file) throws IOException {File localFile = new File("e://a.jpg");String ex = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));//图⽚翻转90int angle = ImageUtil.getAngle(ImageUtil.getExif(file.getInputStream()));BufferedImage bf =ImageUtil.getBufferedImg(ImageIO.read(file.getInputStream()), ImageUtil.getWidth(file.getInputStream()), ImageUtil.getHeight(file.getInputStream()), angle); ImageIO.write(bf, ex.substring(1), localFile);//度问题return localFile.getAbsolutePath();}@RequestMapping("/")public String index(){return "test";}}亲测有效,附上链接->。
javascript:⼀个2D旋转图的实现 今天从图书馆回寝室的路上,突然灵感迸发,想做⼀个旋转图(2D),于是就有了下⽂。
⾸先说⼀下思路吧,我觉得做程序最重要的就是思路了,思路对了,代码那就是⼿到拈来。
-_-! 1、 CSS布局: 我采⽤了4长图⽚,在CSS设置⾥,他并不是绝对定位。
2、采⽤布局转换:在javascript中设置img的position:absolute,同时加上他们的left和top; 3、当点击按钮开始时,开始进⾏旋转。
4、旋转时的逻辑是,由当前图⽚的索引,运动到下⼀张图⽚的索引位置。
特别注意的是: 最后⼀张应该运到到第⼀张的位置,也就是aImg[0]的位置. 5、还有⼀点也很重要。
那就是层级z-index. 这⾥我采⽤⼀个办法。
设置了⼀个变量times,每当点击的时候,times就+1,这样我们就能知道每张图⽚应该在的位置,相应的索引值也应该改变. 那么怎么获取图⽚所在的位置呢? 其实aImg[i]所在的位置,就是原来aImg[(i+times)%aImg.length]所在的位置了(关键在于取模)。
第⼀次也博客,书写和表达可能不太清楚,⼤家见谅,以下为js代码部分:1 window.onload = function(){2var MyApp = {3 dom: {4 aImg: document.getElementsByTagName('img'),5 oBtn: document.getElementById('btn')6 },7 times: 0,8 Switch: true,9 First: true10 };11 absoluted(MyApp.dom.aImg);12 setPosition(MyApp.dom.aImg[0], 200, 200, 2);13 setPosition(MyApp.dom.aImg[1], 351, 300, 3);14 setPosition(MyApp.dom.aImg[2], 502, 200, 2);15 setPosition(MyApp.dom.aImg[3], 351, 122, 1);16 MyApp.dom.oBtn.onclick = function(){17if(MyApp.Switch||MyApp.First){18 MyApp.Switch = false;19 MyApp.First = false;20var a = MyApp.dom;21 MyApp.times++;22for(var i=0;i<a.aImg.length;i++){23 a.aImg[i].style.zIndex = a.aImg[(i+MyApp.times)%a.aImg.length].index;24 }25 changePosition(a.aImg, function(){26 MyApp.Switch = true;27 });28 }29 }30 }31function setPosition(obj, left, top, index){32 obj.style.left = left + 'px';33 obj.style.top = top + 'px';34 obj.style.zIndex = index;35 obj.index = index;36 }37function changePosition(wrap, fn){38for(var i=0;i<wrap.length;i++){39if(i==3){40 MOVE:Buffer_Move(wrap[3],{left: wrap[0].offsetLeft, top: wrap[0].offsetTop});41 }else{42 MOVE:Buffer_Move(wrap[i],{left: wrap[i+1].offsetLeft, top: wrap[i+1].offsetTop}, fn);43 }44 }45 }46function absoluted(wrap){47for(var i=0;i<wrap.length;i++){48 wrap[i].style.left = wrap[i].offsetLeft + 'px';49 wrap[i].style.top = wrap[i].offsetTop + 'px';50 }51for(var i=0;i<wrap.length;i++){52 wrap[i].style.position = 'absolute';53 }54 }另外可能有些同学会问这个MOVE:Buffer_Move是什么东西,其实,这是我写的⼀个运动框架,有缓冲和弹性运动。
javascript结合canvas实现图⽚旋转效果我们在微博上可以对图⽚进⾏向左转向右转等旋转操作,让⽤户可以从不同的视⾓欣赏图⽚效果。
本⽂将结合实例为您讲解如何使⽤Javascript结合相关技术来实现图⽚的旋转效果。
我们使⽤HTML5的canvas标签可对图⽚进⾏旋转操作,对于ie6,7,8不⽀持HTML5的浏览器,我们使⽤IE特有的滤镜效果来实现图⽚旋转。
HTML我们在页⾯中放置⼀张图⽚,在图⽚的上⽅放置两个按钮,通过onclick事件调⽤rotate()函数来控制图⽚向左向右旋转。
<div id="tool"><a href="#" id="arr_left" onclick="rotate('myimg','left')">向左</a><a href="#" id="arr_right" onclick="rotate('myimg','right')">向右</a></div><div id="img"><img src="demo.jpg" width="460" height="305" alt="" id="myimg" /></div>Javascriptfunction rotate(obj,arr){var img = document.getElementById(obj);if(!img || !arr) return false;var n = img.getAttribute('step');if(n== null) n=0;if(arr=='left'){(n==0)? n=3:n--;}else if(arr=='right'){(n==3)? n=0:n++;}img.setAttribute('step',n);...}我们写了个⾃定义函数rotate(),其中参数obj表⽰要旋转的图⽚对象的id,参数arr表⽰旋转⽅向,固定两个值:left(向左)和right(向右)。
java 移动原点以及图形旋转让某个图形旋转一个角度,其旋转中心是当前上下文的原点。
默认情况下原点在(0,0)处,而大多数情况下我们都需要自己设置图形旋转中心,因此我们需要将原点移动到理想位置。
1.移动原点移动原点需要调用Graphics2D类对象的translate(int x, int y)。
其中,x与y表示新原点的坐标。
注意上述示例中两个椭圆的y坐标位置,一个是50,另一个是250。
绘制效果如图11-2所示。
图11-2 绘制两个同列的椭圆下面是移动原点的情况下绘制两个椭圆的示例。
这两个椭圆的y坐标设置成一样,如果没有发生原点移动,那么这两个椭圆将在位置上发生重叠。
而事实上,由于在绘制第二个椭圆之前,原点被移动到(0,200)处,所以,后面的坐标值将以(0,200)为参照点。
例如y坐标值50,其实际效果就相当于没有移动原点情况下的250。
因此,上述示例的绘制效果图与图11-2所示的效果图一模一样。
2.图形旋转旋转图形需要调用Graphics2D类对象的rotate()方法,该方法有如下两种重载形式。
●V oid rotate(double theta) theta表示旋转的角度,单位为弧度。
●V oid rotate(double theta , double x , double y) theta表示旋转的角度,单位为弧度;x与y指定旋转时的原点坐标。
使用void rotate(double theta , double x , double y)方法时,当前上下文中的原点坐标不会改变,该方法的调用效果相当于:也就是说,先将原点移动到(x,y)处,旋转一定角度后,又将原点移回去。
Rotate()方法事实上是旋转了x与y轴,也就是说,发生旋转后,上下文中的x 与y轴发生了旋转。
所以,在接下来设置坐标值时需要考虑到x轴与y轴已经发生了改变。
例如,假设原点坐标为默认值(0,0),有一个椭圆为new Ellipse2D.Double(0, 0, 200, 150),其起点坐标为(0,0)、宽为200、高为150,在默认情况下的图形按逆时针旋转90º后如图11-3所示。
Im4java操作ImageMagick处理图⽚背景之前⽤的是JMagick,各种限制各种坑,直到使⽤了Im4java,真是相当的好⽤啊。
项⽬描述ImageMagic的安装可参考:Im4java是ImageMagick的第⼆个java接⼝。
它不是JMagick的替代品,⽽是作为补充。
JMagick是ImageMagick C-API之上的瘦JNI层。
相⽐之下,im4java只为ImageMagick命令⽣成命令⾏,并将⽣成的命令⾏传递给选定的IM 命令(使⽤ng.ProcessBuilder.start() - ⽅法)。
im4java的缺点:您仅限于IM命令的功能。
使⽤JMagick,您可以访问IM的低级接⼝,所以您可以⾮常详细地控制图像处理。
图像处理会有更好的表现。
im4java的优点:IM命令⾏的界⾯⾮常稳定,因此你的java程序(和im4java-library)可以在很多版本的IM上运⾏。
im4java还提供了更好的OO接⼝(IM命令⾏的“语⾔”,其后缀操作符号很容易转换为OO符号)。
最重要的是:你可以在任何地⽅使⽤im4java,⽽JMagick在某些地⽅会因为JNI的危险性⽽⽆法使⽤(例如java应⽤程序服务器)。
注意事项我⽤的ImageMagick版本是ImageMagick-7.0.8-12-Q16-x64-dll.exe,安装完后发现安装⽬录⾥只有个 magick.exe 命令。
程序⾥直接使⽤convert,composite,identify的时候都会报错,提⽰⽂件找不到。
新版本使⽤这些命令必须先写上 magick 命令才⾏,⽐如这样 magick convert xxxx。
原因可能是ImageMagick版本更新了,但是Im4java版本没更新(Im4java版本是1.4.0),导致出现不兼容的情况,解决办法很简单,直接把 magick.exe 复制三份,重命名为其他三个命令就可以了,实测可⽤。
一、Graphics2D rotate 函数的基本介绍Graphics2D 是 Java 2D 图形类的基础类之一,用于绘制图形、文本和图片。
其中的 rotate 函数是用来实现图形旋转的功能,通过调用该函数可以实现对图形的任意角度旋转。
在本文中,我们将详细介绍rotate 函数的使用方法和原理,帮助读者更好地理解和应用该函数。
二、rotate 函数的语法和参数rotate 函数的语法如下所示:public void rotate(double theta)该函数接受一个 double 类型的参数 theta,表示旋转角度,单位为弧度。
当theta为正值时,表示顺时针旋转;当theta为负值时,表示逆时针旋转。
三、rotate 函数的使用方法1. 创建 Graphics2D 对象在调用 rotate 函数之前,我们首先需要创建一个 Graphics2D 对象,并将其绑定到需要进行图形旋转的图形上下文上。
创建 Graphics2D 对象的代码示例如下:Graphics2D g2d = (Graphics2D) g;2. 调用 rotate 函数实现旋转一旦创建了 Graphics2D 对象,就可以通过调用 rotate 函数来实现图形旋转的功能。
我们可以通过以下代码实现对一个矩形的旋转:g2d.rotate(Math.toRadians(45));3. 绘制旋转后的图形在调用 rotate 函数之后,所有后续的绘图操作都将受到旋转的影响。
我们可以通过以下代码绘制一个旋转后的矩形:g2d.drawRect(100, 100, 200, 100);四、rotate 函数的原理解析rotate 函数实际上是通过矩阵变换来实现图形的旋转。
在调用 rotate 函数时,会根据传入的旋转角度 theta 构造一个旋转矩阵,然后将该矩阵应用到当前的绘图上下文中。
通过矩阵变换,可以将图形按照指定的角度进行旋转,而不改变其原始形状和大小。