在本文中,我们将详细介绍将BufferedImage对象作为文件保存到AmazonS3的各个方面,并为您提供关于bufferedimage转file的相关解答,同时,我们也将为您带来关于Buffere
在本文中,我们将详细介绍将BufferedImage对象作为文件保存到Amazon S3的各个方面,并为您提供关于bufferedimage转file的相关解答,同时,我们也将为您带来关于BufferedImage 与 Image、BufferedImage 类、Image 类、Graphics 类、Image对象及其子类BufferedImage、java – 从BufferedImage到SWT Image的转换的有用知识。
本文目录一览:- 将BufferedImage对象作为文件保存到Amazon S3(bufferedimage转file)
- BufferedImage 与 Image
- BufferedImage 类、Image 类、Graphics 类
- Image对象及其子类BufferedImage
- java – 从BufferedImage到SWT Image的转换
将BufferedImage对象作为文件保存到Amazon S3(bufferedimage转file)
我目前利用以下内容将文件上传到S3:
File file = new File(my_file_path);AmazonS3 s3 = new AmazonS3Client(new PropertiesCredentials(cred));s3.putObject(new PutObjectRequest("folder", key, file));
上面的方法工作正常,但我想直接将a保存BufferedImage
到S3以从应用程序中删除几秒钟,但是我不知道如何执行此操作?这是我当前将图像保存到文件中的方式:
image = new BufferedImage(rawImage.width, rawImage.height, BufferedImage.TYPE_INT_ARGB);File file = new File(filepath);ImageIO.write(image, "png", file);
有没有一种方法可以直接以流的形式直接写入Amazon S3,如果可以,有人可以显示示例吗?
另外,这是个好主意吗?如果它容易出错,我将继续使用当前方法。任何建议表示赞赏。
答案1
小编典典以下(或类似的东西)应该可以正常工作。避免写入物理文件的步骤比处理磁盘I / O的错误发生几率要小一些(至少,随着时间的推移,填满磁盘的机会会减少)。
BufferedImage image = ...ByteArrayOutputStream os = new ByteArrayOutputStream();ImageIO.write(image, "png", os);byte[] buffer = os.toByteArray();InputStream is = new ByteArrayInputStream(buffer);AmazonS3 s3 = new AmazonS3Client(new PropertiesCredentials(cred));ObjectMetadata meta = new ObjectMetadata();meta.setContentLength(buffer.length);s3.putObject(new PutObjectRequest("folder", key, is, meta));
BufferedImage 与 Image
一、BufferedImage 类型与 Byte [] 流之间相互转化
1. 需要用到的类
java.awt.image.BufferedImage;
javax.imageio.ImageIO;
java.io.*;
2. 为什么要将 BufferedImage 转为 byte 数组
在传输中,图片是不能直接传的,因此需要把图片变为字节数组,然后传输比较方便;只需要一般输出流的 write 方法即可;而字节数组变成 BufferedImage 能够还原图像;
3. 如何取得 BufferedImage
BufferedImage image = ImageIO.read(new File("1.gif"));
4.BufferedImage ------>byte[]
ImageIO.write(BufferedImage image,String format,OutputStream out);方法可以很好的解决问题;
参数image表示获得的BufferedImage;
参数format表示图片的格式,比如“gif”等;
参数out表示输出流,如果要转成Byte数组,则输出流为ByteArrayOutputStream即可;
执行完后,只需要 toByteArray () 就能得到 byte [];
5.byte[] ------>BufferedImage
ByteArrayInputStream in = new ByteArrayInputStream(byte[]b); //将b作为输入流;
BufferedImage image = ImageIO.read(InputStream in); //将in作为输入流,读取图片存入image中,而这里in可以为ByteArrayInputStream();
6. 显示 BufferedImage
public void paint(Graphics g){
super.paint(g);
g.drawImage(image); //image为BufferedImage类型
}
二、BufferedImage 与 Image 之间的相互转换
1.
BufferedImage input = ImageIO.read(file1);
Image big = input.getScaledInstance(256, 256,Image.SCALE_DEFAULT); //放缩图片
BufferedImage inputbig = new BufferedImage(256, 256,BufferedImage.TYPE_INT_BGR);
inputbig.getGraphics().drawImage(input, 0, 0, 256, 256, null); //画图
2.
public BufferedImage toBufferedImage(Image image) {
if (image instanceof BufferedImage) { return (BufferedImage) image; }
image = new ImageIcon(image).getImage();
//ImageIcon与Image之间的转化: ImageIcon icon = new ImageIcon(image); image = icon.getImage();
boolean hasAlpha = false;
BufferedImage bimage = null;
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
try {
int transparency = Transparency.OPAQUE;
if (hasAlpha) { transparency = Transparency.BITMASK; }
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();
bimage = gc.createCompatibleImage(image.getWidth(null),
image.getHeight(null), transparency);
} catch (HeadlessException e) {
}
if (bimage == null) {
int type = BufferedImage.TYPE_INT_RGB;
if (hasAlpha) { type = BufferedImage.TYPE_INT_ARGB; }
bimage = new BufferedImage(image.getWidth(null),image.getHeight(null), type);
}
Graphics g = bimage.createGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();
return bimage;
}
BufferedImage 类、Image 类、Graphics 类
<div id="content_views"> <!-- flowchart 箭头图标 勿删 --> <svg xmlns="http://www.w3.org/2000/svg"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block"></path> </svg> <h3><a name="t0"></a><a id="BufferedImage_0"></a>BufferedImage</h3> <ul> <li> <p>Image 是一个抽象类,BufferedImage 是其实现类,是一个带缓冲区图像类,主要作用是将一幅图片加载到内存中(BufferedImage 生成的图片在内存里有一个图像缓冲区,利用这个缓冲区我们可以很方便地操作这个图片),提供获得绘图对象、图像缩放、选择图像平滑度等功能,通常用来做图片大小变换、图片变灰、设置透明不透明等。</p> <pre><codeonclick="mdcp.signin (event)"> <span><span>public</span></span> <span><span>abstract</span></span> Graphics getGraphics (); <span><span>// 获得在图像上绘图的 Graphics 对象 </span></span> <divdata-title="登录后复制"></div></code></pre> </li> <li> <p>Java 将一幅图片加载到内存的方法是:</p> <pre><codeonclick="mdcp.signin (event)"> <span><span>String</span></span> imgPath = <span><span>"C://demo.jpg"</span></span>; BufferedImage image = ImageIO.read (<span><span>new</span></span> FileInputStream (imgPath)); <divdata-title="登录后复制"></div></code></pre> </li> <li> <p > 继而可以对图片进行操作,比如,获得图片的宽度:image.getWidth ()</p> </li> <li> <p > 图片只有加载到内存中才能进行进一步的处理。</p> </li> <li> <p>RGB:R(红)G(绿)B(蓝)色彩模式是工业界的一种颜色标准。在 Java 中每个 RGB 像素所占的位数为 8.</p> </li> <li> <p > 创建:</p> <ul> <li> <p > 直接调用构造函数 </p> <p>// 指定宽高、图像字节灰度 < br> BufferedImage bi = new BufferedImage (width, height, BufferedImage.TYPE_BYTE_GRAY)<br> // 创建一个不带透明色的对象 < br> BufferedImage bimage = new BufferedImage (width, height, BufferedImage.TYPE_INT_RGB);<br> // 创建一个带透明色的对象 < br> new BufferedImage (width, height, BufferedImage.TYPE_INT_ARGB);</p> </li> <li> <p > 根据已经存在的 BufferedImage 对象创建一个 copy 体 </p> <p>public BufferedImage createBufferedImage (BufferedImage src)</p> </li> <li> <p > 通过创建 ColorModel(颜色转换为 Java 中的像素表示)和 Raster(光栅,描述像素的)对象创建 BufferedImage 对象 </p> <p>public BufferedImage createBufferedImage(int width , int height, byte [] pixels){ //pixel 像素 </p> <p>ColorModel cm = getColorModel ();</p> <p>SampleModel sm = getIndexSampleModel ((IndexColorModel) cm, width,height);</p> <p>DataBuffer db = new DataBufferByte (pixels, width*height,0);</p> <p>WritableRaster raster = Raster.creatWritableRaster (sm, db,null);</p> <p>BufferedImage image = new BufferedImage (cm, raster,false, null);</p> <p>return image;</p> <p>}</p> </li> <li> <p > 读取一个图片文件来转换.</p> <p>BufferedImage image = ImageIo.read (new FileInputStream (filePath));</p> </li> </ul> </li> <li> <p > 保存:找个位置写出去 </p> <pre><codeonclick="mdcp.signin (event)"> <span><span>File</span></span> outputfile = <span><span>new</span></span> <span><span>File</span></span>(<span><span>"save.png"</span></span>); ImageIO.write (bi,<span><span>"png"</span></span>,outputfile); <divdata-title="登录后复制"></div></code></pre> </li> <li> <p><a href="https://www.cnblogs.com/bigdream6/p/8366248.html" rel="nofollow" data-token="d6fa49301d2be718f3ee6325583219b8">Raster 和 ColorModel 对象、BufferedImage 的创建与保存 </a></p> </li> </ul> <h3><a name="t1"></a><a id="ImageIO_53"></a>ImageIO</h3> <ul> <li > 提供 read () 和 write () 静态方法,读写图片,比以往的 InputStream 读写更方便。</li> </ul> <h3><a name="t2"></a><a id="BufferedImagebyte_55"></a>BufferedImage 与 byte 数组的转换 </h3> <ul> <li> <p > 在传输中,图片是不能直接传的,需要先转为字节数组再传输较为方便;而字节数组再转回 BufferedImage 则还原图片。</p> </li> <li> <p>BufferedImage–>byte []</p> <pre><codeonclick="mdcp.signin (event)"> ImageIO.<span><span>write</span></span>(BufferedImage image,<span><span>String</span></span> format,OutputStream <span><span>out</span></span>); <span><span>//format: 图片格式,“gif"等;</span></span> <span><span>//out: 目标;特别的,如果目标为 byte 数组,则将其预设为 ByteArrayOutputStream 即可传入此方法,执行完后,只要 toByteArray () 即可获得 byte [].</span></span> <divdata-title=" 登录后复制 "></div></code></pre> </li> <li> <p>byte []–>bufferedImage</p> <pre><codeonclick="mdcp.signin (event)"> ByteArrayInputStream <span><span>in</span></span> = new ByteArrayInputStream (<span><span>byte</span></span>[] b); // 将 b 作为输入流; BufferedImage image = ImageIO.<span><span>read</span></span>(InputStream <span><span>in</span></span>); // 将 < span><span>in</span></span > 作为输入流,读取图片存入 image 中,而这里 < span><span>in</span></span > 可以为 ByteArrayInputStream (); <divdata-title=" 登录后复制 "></div></code></pre> </li> <li> <p><a href="https://blog.csdn.net/rhl127/article/details/76850562"rel="nofollow"data-token="7723cbccc7226c1b4ec989830416dee8"> 参考文章 </a></p> </li> </ul> <h3><a name="t3"></a><a id="_68"></a > 应用 </h3> <ul> <li> <p > 缓存网络图片 </p> <pre><codeonclick="mdcp.signin (event)"> <span><span>// 获得图片地址 </span></span> Url img = <span><span>new</span></span> URL (url); <span><span>// 获得图片输入流 </span></span> InputStream <span><span>in</span></span> = img.openStream (); <span><span>// 把输入流转为 BufferedImage</span></span> JPEGImageDecoder decoderFile = JPEGCodec.createJPEGDecoder (<span><span>in</span></span>); BufferedImage image = decoderFile.decodeAsBufferedImage (); <span><span>// 获得其 byte 数组 </span></span> ImageIO.write (image, <span><span>"jpg"</span></span>, bos); <span><span>// 写出 </span></span> InputStream <span><span>is</span></span> = <span><span>new</span></span> ByteArrayInputStream (os.toByteArray ()); <divdata-title=" 登录后复制 "></div></code></pre> </li> <li> <p > 具体测试与改动 </p> <pre><codeonclick="mdcp.signin (event)"> URL url = new URL (<span><span>"http://www.google.com/intl/en_ALL/images/logo.gif"</span></span>); BufferedImage image = ImageIO.<span><span>read</span></span>(url); ByteArrayOutputStream <span><span>os</span></span> = new ByteArrayOutputStream (); ImageIO.<span><span>write</span></span>(image, <span><span>"gif"</span></span>, <span><span>os</span></span>); InputStream is = new ByteArrayInputStream (<span><span>os</span></span>.toByteArray ()); <divdata-title=" 登录后复制 "></div></code></pre> </li> </ul> <h3><a name="t4"></a><a id="Graphics_89"></a>Graphics</h3> <ul> <li> <p > 提供基本绘图和显示格式化文字的方法,画图用的坐标系原点在左上角,纵轴向下。主要有画线段、矩形、圆、椭圆、圆弧、多边形等各种颜色的图形、线条。</p> </li> <li> <p>Graphics2D 类提供更强大的绘图能力。</p> </li> <li> <p > 在窗口画一条直线:drawLine (int x1,int y1,int x2,int y2)</p> <pre><codeonclick="mdcp.signin (event)"> <span><span>g</span></span><span><span>.drawLine</span></span>(<span><span>3</span></span>,<span><span>3</span></span>,<span><span>50</span></span>,<span><span>50</span></span>);<span><span>// 在 (3,3) 与 (50,50) 之间画一条线段 </span></span> <span><span>g</span></span><span><span>.drawLine</span></span>(<span><span>100</span></span>,<span><span>100</span></span>,<span><span>100</span></span>,<span><span>100</span></span>);<span><span>// 画一个点 </span></span> <divdata-title=" 登录后复制 "></div></code></pre> </li> <li> <p > 画折线:drawPolyline (int [],int [],int),各点的 x、y 坐标,折线数。</p> </li> <li> <p > 画字符串:drawString (String str,int x,int y),x、y 是开始显示的位置,使用默认字体、大小、黑色。再写下一行要写在什么位置就很难精确定位了。若要精确定位,则需要知道字符串显示的长度和字高,可以通过 FontMetrics 类来实现。</p> <pre><codeonclick="mdcp.signin (event)"> FontMetrics fm = g.getFontMetrics (font); <span><span>// 从 Graphics 对象获取 FontMetrics 对象 </span></span> <span><span>int</span></span> height = fm.getHeight (); <span><span>// 调用其 getHeight () 获得字高 </span></span> <span><span>int</span></span> width = fm.stringWidth (s1); <span><span>// 获得字符串宽度 </span></span> <divdata-title=" 登录后复制 "></div></code></pre> </li> <li> <p > 应用 FontMetrics 精确定位 </p> <pre><codeonclick="mdcp.signin (event)"> <span><span>String</span></span> s1 = <span><span>"Hello, Java World!"</span></span>; g.setColor (Color.red); setBackground (<span><span>new</span></span> Color (<span><span>0</span></span>,<span><span>255</span></span>,<span><span>0</span></span>)); Font font = <span><span>new</span></span> Font (<span><span>"Arial"</span></span>, Font.BOLD, <span><span>18</span></span>); g.setFont (font); FontMetrics fm = g.getFontMetrics (font); <span><span>int</span></span> height = fm.getHeight (); <span><span>int</span></span> width = fm.stringWidth (s1); <span><span>int</span></span> posx =<span><span>50</span></span>; <span><span>int</span></span> posy = <span><span>50</span></span>; g.drawString (s1 ,posx, posy); g.drawString (<span><span>"I will come in."</span></span> ,posx +width, posy+height); <divdata-title=" 登录后复制 "></div></code></pre> </li> <li> <p > 显示效果 </p> </li> </ul> <p><img src="http://zhuzhuzai.oss-cn-shenzhen.aliyuncs.com/% E6%8D%95% E8%8E% B7600.PNG"alt=""></p> <ul> <li> <p > 设置画笔字体:setFont (Font font);Java 有一个类叫 GraphicsEnvironment 提供绘图环境,其中 getAvailableFontFamilyNames () 方法可获取程序所在操作系统的所有字体名(是 String 不是 Font)。</p> <pre><codeonclick="mdcp.signin (event)"> GraphicsEnvironment gv = GraphicsEnvironment.getLocalGraphicsEnvironment (); <span><span>String</span></span>[] ftNames = gv.getAvailableFontFamilyNames (); <span><span>for</span></span> (<span><span>int</span></span> i=<span><span>0</span></span>; i<ftNames.length; i++) Font ft = <span><span>new</span></span> Font (ftNames [i], Font.BOLD, <span><span>14</span></span>); <divdata-title="登录后复制"></div></code></pre> </li> <li> <p > 设置前景色(画笔颜色):setColor (Color color),选择颜色有两种方法,一是直接用颜色值 RGB 创建 Color 对象:Color color=new Color (int R,int G,int B), 由于是 8 位,所以不能超过 255; 二是用颜色常量如 Color.red,Color.green 等,Color 类提供了 13 中颜色常量。</p> </li> <li> <p > 设置背景色:setBackground (new Color (int,int,int))</p> </li> <li> <p > 来个写不同字体的小例子 </p> <pre><codeonclick="mdcp.signin (event)"> <span><span><span><span>public</span></span></span><span> </span><span><span><span>void</span></span></span><span> </span><span><span><span>paint</span></span></span><span> </span><span><span><span>(Graphics g)</span></span></span></span>{ String s1 = <span><span>"This Font is"</span></span>; Font font = <span><span>new</span></span> Font (<span><span>"Arial"</span></span>, Font.BOLD, <span><span>18</span></span>); g.setColor (Color.red); setBackground (<span><span>new</span></span> Color (<span><span>0</span></span>,<span><span>255</span></span>,<span><span>0</span></span>)); g.setFont (font); g.drawString (s1 + font.getName () ,<span><span>20</span></span>, <span><span>60</span></span>); g.setFont (<span><span>new</span></span> Font (<span><span>"隶书"</span></span>, Font.BOLD, <span><span>28</span></span>)); g.drawString (<span><span>"现在是隶书"</span></span> ,<span><span>20</span></span>, <span><span>120</span></span>); g.setColor (<span><span>new</span></span> Color (<span><span>0</span></span>,<span><span>0</span></span>,<span><span>0</span></span>)); } <divdata-title="登录后复制"></div></code></pre> </li> <li> <p > 显示效果 </p> </li> </ul> <p><img src="http://zhuzhuzai.oss-cn-shenzhen.aliyuncs.com/% E6%8D%95% E8%8E% B7599.PNG" alt=""></p> <ul> <li> <p > 画矩形:drawRect (int x,int y,int width,int height), 画矩形线框,x,y 指定了左上角位置,后两个为矩形宽高;fillRect (iny x.int y,int width,int height), 指定填充颜色。</p> <pre><codeonclick="mdcp.signin (event)"> <span><span>g</span></span><span><span>.drawRect</span></span>(<span><span>80</span></span>,<span><span>100</span></span>,<span><span>40</span></span>,<span><span>25</span></span>);<span><span>// 画线框 </span></span> <span><span>g</span></span><span><span>.setColor</span></span>(Color.yellow);<span><span>g</span></span><span><span>.fillRect</span></span>(<span><span>20</span></span>,<span><span>70</span></span>,<span><span>20</span></span>,<span><span>30</span></span>);<span><span>// 画着色块 </span></span> <divdata-title=" 登录后复制 "></div></code></pre> </li> <li> <p > 画圆角矩形:drawRoundRect (int x,int y,int width,int height,int arcWidth,int arcHeight), 线框,最后两个宽高是圆角弧的横向直径和纵向直径;fillRoundRect (int x,int y,int width,int height,int arcWidth,int arcHeight), 颜色填充。</p> <pre><codeonclick="mdcp.signin (event)"> <span><span>g</span></span><span><span>.drawRoundRect</span></span>(<span><span>10</span></span>,<span><span>10</span></span>,<span><span>150</span></span>,<span><span>70</span></span>,<span><span>40</span></span>,<span><span>25</span></span>);<span><span>// 画一个圆角矩形 </span></span> <span><span>g</span></span><span><span>.setColor</span></span>(Color.blue); <span><span>g</span></span><span><span>.fillRoundRect</span></span>(<span><span>80</span></span>,<span><span>100</span></span>,<span><span>100</span></span>,<span><span>100</span></span>,<span><span>60</span></span>,<span><span>40</span></span>);<span><span>// 涂一个圆角矩形块 </span></span> <span><span>g</span></span><span><span>.drawRoundRect</span></span>(<span><span>10</span></span>,<span><span>150</span></span>,<span><span>40</span></span>,<span><span>40</span></span>,<span><span>40</span></span>,<span><span>40</span></span>);<span><span>// 画圆 </span></span> <span><span>g</span></span><span><span>.setColor</span></span>(Color.red); <span><span>g</span></span><span><span>.fillRoundRect</span></span>(<span><span>80</span></span>,<span><span>100</span></span>,<span><span>100</span></span>,<span><span>100</span></span>,<span><span>100</span></span>,<span><span>100</span></span>);<span><span>// 画圆块 </span></span> <divdata-title=" 登录后复制 "></div></code></pre> </li> <li> <p > 画三维矩形: draw3DRect (int x,int y,int width,int height,boolean raised), 画一个突出显示的矩形(即 3D 矩形),raise 是突出与否;fill3DRect (int x,int y,int width,int height,boolean raised),颜色填充。</p> <pre><codeonclick="mdcp.signin (event)"> <span><span>g</span></span><span><span>.draw3DRect</span></span>(<span><span>80</span></span>,<span><span>100</span></span>,<span><span>40</span></span>,<span><span>25</span></span>,true);<span><span>// 画一个线框 </span></span> <span><span>g</span></span><span><span>.setColor</span></span>(Color.yellow); <span><span>g</span></span><span><span>.fill3DRect</span></span>(<span><span>20</span></span>,<span><span>70</span></span>,<span><span>20</span></span>,<span><span>30</span></span>,true);<span><span>// 画一个着色块 </span></span> <divdata-title=" 登录后复制 "></div></code></pre> </li> <li> <p > 画椭圆:drawOval (int x,int y,int width,int height),x、y 是中心坐标,长轴、短轴;fillOval (int x,int y,int width,int height), 填充。</p> </li> <li> <p > 画圆弧:drawArc (int x,int y,int width,int height,int startAngle,int arcAngle), 画椭圆一部分的圆弧线,椭圆中心时它的外接矩形的中心,外接矩形左上角坐标为 (x,y),宽 width,高 height,startAngle 单位是度,其实角度 0 度是指 3 点钟方向,startAngle 和 arcAngle 表示从 startAngle 角度开始,逆时针方向画 arcAngle 度的弧,约定,正值度数是逆时针方向,负数为顺时针,例如 - 90° 是 6 点钟方向;fillArc (int x,int y,int width, int height, int startAngle, int arcAngle),着色。</p> <pre><codeonclick="mdcp.signin (event)"> <span><span>g</span></span><span><span>.drawArc</span></span>(<span><span>10</span></span>,<span><span>40</span></span>,<span><span>90</span></span>,<span><span>50</span></span>,<span><span>0</span></span>,<span><span>180</span></span>);<span><span>// 画圆弧线 </span></span> <span><span>g</span></span><span><span>.drawArc</span></span>(<span><span>100</span></span>,<span><span>40</span></span>,<span><span>90</span></span>,<span><span>50</span></span>,<span><span>180</span></span>,<span><span>180</span></span>);<span><span>// 画圆弧线 </span></span> <span><span>g</span></span><span><span>.setColor</span></span>(Color.yellow); <span><span>g</span></span><span><span>.fillArc</span></span>(<span><span>10</span></span>,<span><span>100</span></span>,<span><span>40</span></span>,<span><span>40</span></span>,<span><span>0</span></span>,-<span><span>270</span></span>);<span><span>// 填充缺右上角的四分之三的椭圆 </span></span> <span><span>g</span></span><span><span>.setColor</span></span>(Color.green); <span><span>g</span></span><span><span>.fillArc</span></span>(<span><span>60</span></span>,<span><span>110</span></span>,<span><span>110</span></span>,<span><span>60</span></span>,-<span><span>90</span></span>,-<span><span>270</span></span>);<span><span>// 填充缺左下角的四分之三的椭圆 </span></span> <divdata-title=" 登录后复制 "></div></code></pre> </li> <li> <p > 画多边形:drawPolygon (int xPoints [],int yPoints [],int nPoints), 多边形是多条线段首尾连接而成的封笔平面图,多边形线段端点的 x,y 坐标存储在两个数组中,画多边形就是按给定的坐标点顺序用直线段将它们连起来,nPoints 是坐标点个数;fillPolygon (int xPoints [],int yPoints [],int nPoints),着色。</p> <pre><codeonclick="mdcp.signin (event)"> <span><span>int</span></span> px1 []={<span><span>50</span></span>,<span><span>90</span></span>,<span><span>10</span></span>,<span><span>50</span></span>};<span><span>// 首末点相重,才能画多边形 </span></span> <span><span>int</span></span> py1 []={<span><span>10</span></span>,<span><span>50</span></span>,<span><span>50</span></span>,<span><span>10</span></span>}; <span><span>int</span></span> px2 []={<span><span>140</span></span>,<span><span>180</span></span>,<span><span>170</span></span>,<span><span>180</span></span>,<span><span>140</span></span>,<span><span>100</span></span>,<span><span>110</span></span>,<span><span>140</span></span>}; <span><span>int</span></span> py2 []={<span><span>5</span></span>,<span><span>25</span></span>,<span><span>35</span></span>,<span><span>45</span></span>,<span><span>65</span></span>,<span><span>35</span></span>,<span><span>25</span></span>,<span><span>5</span></span>}; g.setColor (Color.blue); g.fillPolygon (px1,py1,<span><span>4</span></span>); g.setColor (Color.red); g.drawPolygon (px2,py2,<span><span>9</span></span>); <divdata-title=" 登录后复制 "></div></code></pre> <ul> <li> <p > 也可以用多边形对象 Polygon 画多边形 </p> <ul> <li>Polygon ():创建多边形对象,暂时没有坐标点。</li> <li>Polygon (int xPoints [],int yPoints [],int nPoints):用指定的坐标点创建多边形对象。</li> <li>addPoint ():将一个坐标点加入到 Polygon 对象中。</li> <li>drawPolygon (Polygon p):绘制多边形。</li> <li>fillPolygon (Polygon p):和指定的颜色填充多边形。</li> </ul> </li> <li> <p > 画一个三角形 </p> <p>int x []={140,180,170,180,140,100,110,100}; // 用多边形对象不要求首末点重合 < br> int y []={5,25,35,45,65,45,35,25};<br> Polygon ponlygon1=new Polygon ();<br> polygon1.addPoint (50,10);<br> polygon1.addPoint (90,50);<br> polygon1.addPoint (10,50);<br> g.drawPolygon (polygon1);<br> g.setColor (Color.yellow);<br> Polygon polygon2 = new Polygon (x,y,8);<br> g.fillPolygon (polygon2);</p> </li> </ul> </li> <li> <p > 画图片:drawImage (Image image,int x,int y)</p> </li> <li> <p > 擦除矩形块:clearREct (int x,int y,int width,int height), 当需要在一个着色图形中有一个空缺的矩形时,可用背景色填充一矩形块实现,相当于在该图形上使用了橡皮擦。以下代码实现了在一个圆中擦除了一个矩形块 </p> <pre><codeonclick="mdcp.signin (event)"> <span><span>g</span></span><span><span>.setColor</span></span>(<span><span>Color</span></span><span><span>.blue</span></span>); <span><span>g</span></span><span><span>.fillOval</span></span>(50,50,100,100);<span><span>g</span></span><span><span>.clearRect</span></span>(70,70,40,55); <divdata-title=" 登录后复制 "></div></code></pre> </li> <li> <p > 限定作图显示区域:clipRect (int x,int y,int width,int height), 用一个矩形表示图形的显示区域,超出部分不显示,多个限制区有覆盖时,得到交集区域 </p> <pre><codeonclick="mdcp.signin (event)"> <span><span>g</span></span><span><span>.clipRect</span></span>(<span><span>0</span></span>,<span><span>0</span></span>,<span><span>100</span></span>,<span><span>50</span></span>);<span><span>g</span></span><span><span>.clipRect</span></span>(<span><span>50</span></span>,<span><span>25</span></span>,<span><span>100</span></span>,<span><span>50</span></span>); <divdata-title=" 登录后复制 "></div></code></pre> </li> <li> <p > 复制图形:copyArea (int x,int y,int width,int height,int dx,int dy),dx 和 dy 表示将图形复制到原位置偏移的像素点数,正值为往右或往下偏移,负值为往左或往上偏移,x、y 是要复制矩形区域的左上角坐标。以下代码将一个矩形的部分、另一个矩形的全部分别平移 </p> <pre><codeonclick="mdcp.signin (event)"> <span><span>g</span></span><span><span>.drawRect</span></span>(<span><span>10</span></span>,<span><span>10</span></span>,<span><span>60</span></span>,<span><span>90</span></span>); <span><span>g</span></span><span><span>.fillRect</span></span>(<span><span>90</span></span>,<span><span>10</span></span>,<span><span>60</span></span>,<span><span>90</span></span>); <span><span>g</span></span><span><span>.copyArea</span></span>(<span><span>40</span></span>,<span><span>50</span></span>,<span><span>60</span></span>,<span><span>70</span></span>,-<span><span>20</span></span>,<span><span>80</span></span>); <span><span>g</span></span><span><span>.copyArea</span></span>(<span><span>110</span></span>,<span><span>50</span></span>,<span><span>60</span></span>,<span><span>60</span></span>,<span><span>10</span></span>,<span><span>80</span></span>); <divdata-title=" 登录后复制 "></div></code></pre> </li> <li> <p > 对 Point、Rectangle 类的应用 </p> <pre><codeonclick="mdcp.signin (event)"> Point p = <span><span>new</span></span> Point (cx <span><span>/ 2, cy /</span></span> <span><span>2</span></span>); <span><span>// 定义一个点 </span></span> Rectangle rect = <span><span>new</span></span> Rectangle ((p.x - <span><span>40</span></span>), (p.y - <span><span>40</span></span>), <span><span>80</span></span>, <span><span>40</span></span>); <span><span>// 定义一个矩形 </span></span> <span><span>int</span></span>[] xP = {(p.x - <span><span>40</span></span>), (p.x + <span><span>90</span></span>), p.x+<span><span>200</span></span>, (p.x - <span><span>40</span></span>)}; <span><span>int</span></span>[] yP = {(p.y - <span><span>40</span></span>), (p.y +<span><span>140</span></span>), (p.y + <span><span>60</span></span>), (p.y<span><span>-40</span></span>)}; g.drawArc (rect.x, rect.y, rect.width, rect.height * <span><span>2</span></span>, <span><span>270</span></span>, <span><span>90</span></span>); <span><span>// 画弧 </span></span> g.drawPolygon (xP, yP,<span><span>3</span></span>); <span><span>// 画多边形 </span></span> g.setColor (Color.red); <divdata-title=" 登录后复制 "></div></code></pre> </li> <li> <p><a href="https://www.cnblogs.com/donghb/p/7637990.html"rel="nofollow"data-token="9cfc91a9b91f9954a7cd97efc4a559b4"> 画图形方法 </a></p> </li> </ul> <h3><a name="t5"></a><a id="_218"></a > 代码实例 </h3> <ul> <li>github/image_verifyCode 分支 /thz-parent/thz-manager-web/WebPageController、thz-common/tool/RandomValidateCodeUtil、RandomValidateCodeUtilTest</li> </ul> 原文地址:https://blog.csdn.net/jiachunchun/article/details/89670721 </div>
Image对象及其子类BufferedImage
(1)java.awt.Image图像类是,提供获得绘图对象、图像缩放、选择图像平滑度等功能,声明如下:
public abstract class Image extends Object
{
public abstract Graphics getGraphics() //获得在图像上绘图的Graphics对象
}
(2)Image的一个java.awt.image.BufferedImage是带数据缓冲区的图像类,BufferedImage生成的图片在内存里有一个图像缓冲区,利用这个缓冲区我们可以很方便的操作这个图片,通常用来做图片修改操作如大小变换、图片变灰、设置图片透明或不透明等,其声明如下:
public class BufferedImage extends Image implements WritableRenderedeImage,Transparency
{
public BufferedIamge(int width,int height,int imageType) //imageType指定图像类型
}
BufferedImage 由图像数据的 ColorModel 和 Raster 组成。Raster
的 SampleModel 中 band 的数量和类型必须与 ColorModel
所要求的数量和类型相匹配,以表示其颜色和 alpha 分量。所有 BufferedImage
对象的左上角坐标都为 (0,0)。因此,用来构造 BufferedImage
的任何 Raster
都必须满足:minX=0 且 minY=0。
Raster 的数据获取和设置方法,以及 ColorModel
的颜色特征化方法
方法见http://www.cjsdn.net/Doc/JDK50/java/awt/image/BufferedImage.html
java – 从BufferedImage到SWT Image的转换
public static ImageData convertToSWT(BufferedImage bufferedImage) { if (bufferedImage.getColorModel() instanceof DirectColorModel) { DirectColorModel colorModel = (DirectColorModel) bufferedImage.getColorModel(); PaletteData palette = new PaletteData( colorModel.getRedMask(),colorModel.getGreenMask(),colorModel.getBlueMask() ); ImageData data = new ImageData( bufferedImage.getWidth(),bufferedImage.getHeight(),colorModel.getPixelSize(),palette ); WritableRaster raster = bufferedImage.getRaster(); int[] pixelArray = new int[3]; for (int y = 0; y < data.height; y++) { for (int x = 0; x < data.width; x++) { raster.getPixel(x,y,pixelArray); int pixel = palette.getPixel( new RGB(pixelArray[0],pixelArray[1],pixelArray[2]) ); data.setPixel(x,pixel); } } return data; } else if (bufferedImage.getColorModel() instanceof IndexColorModel) { IndexColorModel colorModel = (IndexColorModel) bufferedImage.getColorModel(); int size = colorModel.getMapSize(); byte[] reds = new byte[size]; byte[] greens = new byte[size]; byte[] blues = new byte[size]; colorModel.getReds(reds); colorModel.getGreens(greens); colorModel.getBlues(blues); RGB[] rgbs = new RGB[size]; for (int i = 0; i < rgbs.length; i++) { rgbs[i] = new RGB(reds[i] & 0xFF,greens[i] & 0xFF,blues[i] & 0xFF); } PaletteData palette = new PaletteData(rgbs); ImageData data = new ImageData( bufferedImage.getWidth(),palette ); data.transparentPixel = colorModel.getTransparentPixel(); WritableRaster raster = bufferedImage.getRaster(); int[] pixelArray = new int[1]; for (int y = 0; y < data.height; y++) { for (int x = 0; x < data.width; x++) { raster.getPixel(x,pixelArray); data.setPixel(x,pixelArray[0]); } } return data; } return null; }
(见于:http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/ConvertsabufferedimagetoSWTImageData.htm).
我测试过它,它运行得很好.问题是我不理解它(我最好的猜测是它使用两者的原始数据接口来进行传输).在我看来,一个更简单的解决方案是将BufferedImage写入ByteArrayOutputStream,然后将其读回SWT Image withByteArrayInputStream.这个解决方案有什么问题吗?速度怎么样?
这种转换是必要的,因为所有图像大小调整库都用于AWT,但我用SWT显示图像.
谢谢!
解决方法
今天关于将BufferedImage对象作为文件保存到Amazon S3和bufferedimage转file的讲解已经结束,谢谢您的阅读,如果想了解更多关于BufferedImage 与 Image、BufferedImage 类、Image 类、Graphics 类、Image对象及其子类BufferedImage、java – 从BufferedImage到SWT Image的转换的相关知识,请在本站搜索。
本文标签: