GVKun编程网logo

Java Graphics.drawImage()如何工作,ImageObserver的作用是什么(java graphics drawimage)

11

在本文中,我们将为您详细介绍JavaGraphics.drawImage的相关知识,并且为您解答关于如何工作,ImageObserver的作用是什么的疑问,此外,我们还会提供一些关于(C#)graph

在本文中,我们将为您详细介绍Java Graphics.drawImage的相关知识,并且为您解答关于如何工作,ImageObserver的作用是什么的疑问,此外,我们还会提供一些关于(C#)graphics.drawImage有大小限制吗?怎么处理呢?、BufferedImage 类、Image 类、Graphics 类、C# GDI graphics.DrawImage 的参数问题、c# – 用于大图像的Graphics.DrawImage替代品的有用信息。

本文目录一览:

Java Graphics.drawImage()如何工作,ImageObserver的作用是什么(java graphics drawimage)

Java Graphics.drawImage()如何工作,ImageObserver的作用是什么(java graphics drawimage)

Java的drawImage()应该如何使用?我认为JDK文档不会很快到来。例如,所有drawImage签名都需要ImageObserver,但是有关此文档对新用户不是很有帮助。

答案1

小编典典

您可以摆脱Graphics.drawImage(img, x, y,null)[或类似]。该ImageObserver参数是一个回调,用于通知您绘制操作的进度;并且仅在异步获取Image参数时才有用。

更清楚地说,如果调用drawImage未完全加载的Image,它将:

  1. 返回false(立即)
  2. 画出尽可能多的Image(全部已加载)
  3. 并在将来的某个时间点调用ImageObserver更多可用的图片

基本上,如果您正在使用内存Image(从文件系统加载或由程序构造),则不必担心该ImageObserver参数。如果您要Image通过网络加载,而不明确等待它们加载,则需要使用ImageObserver来确保“完全”绘制Image

(C#)graphics.drawImage有大小限制吗?怎么处理呢?

(C#)graphics.drawImage有大小限制吗?怎么处理呢?

我试图显示一些数据的非常大的图形表示.我在我的表单上的PictureBox控件的onPaint上使用位图来持久存储图像和e.Graphics.DrawImage(myBitmap,new Point(0,0)).我注意到(并且在其他网站上提到过)如果我的图像的高度或宽度大于2 ^ 15,我会得到一个参数无效例外,但我没有找到任何关于此限制的官方文档.

这个2 ^ 15图像大小限制了Graphics.DrawImage的明确官方部分吗?是否有任何简单的解决方法可以将整个图像渲染到表单上?

(是的,pictureBox被设置为与图像相同的大小,或者更大.但问题是,我应该只使用表单的onPaint而不是图片框?)

解决方法:

你在这里有一些问题.首先,从根本上不可能显示这么大的图像(除非你有一些非常庞大的显示器或多个显示器设置),而不是将其缩小到适合普通屏幕的尺寸.

您可以使用Graphics.DrawImage执行此尺寸缩减,但请记住,即使使用高质量的InterpolationMode,插值也只能在最多几个相邻像素上完成,这意味着您可以减少的最大量限制没有严重信息丢失的图像(通常低至25%).

其次,.Net中的Bitmap对象比简单的像素数组要复杂得多.位图有时是在视频RAM而不是通用程序存储器中创建的,这会更严重地限制它们的最大尺寸(在紧凑的框架中,作为一个示例,其中一个位图构造器在视频RAM中创建像素数据,限制为4MB而不是通常可用于.NET进程的32MB).因此,没有记录Bitmap的最大大小 – 这是一个内部实现细节(受到任何已经存在的位图的影响),程序员只能通过获取抛出的异常来发现困难的方法,如果它太大了.因此,使用Bitmap存储任意大量的数据点是行不通的.

这里你最好的方法可能是将你的数据存储为一个普通的二维数组(可能是int [,]类型),这可能是任意大而不会抛出OutOfMemoryException(尽管不会让你的计算机变得疯狂) ,然后编写一个自定义方法,从这个数组复制到一个实际(和实际大小)的位图.然后,您将从此Bitmap复制到PictureBox(或者更简单地说,只需将此Bitmap设置为图片框的Image属性 – 尽可能避免使用Paint方法).

BufferedImage 类、Image 类、Graphics 类

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–&gt;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 []–&gt;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&lt;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>

C# GDI graphics.DrawImage 的参数问题

C# GDI graphics.DrawImage 的参数问题

           graphics.DrawImage(imageSource,
                new System.Drawing.Point[] {
                                new System.Drawing.Point(1,1),
                                new System.Drawing.Point(3, 1),
                                new System.Drawing.Point(1, 3),
                        }
            );
            graphics.DrawImage(imageSource,
                new System.Drawing.Point[] {
                                new System.Drawing.Point(1,3),
                                new System.Drawing.Point(3, 3),
                                new System.Drawing.Point(1, 5),
                        }
            );

对于如上代码,

传入平行的点坐标,包含的点实际上每个都有3*3=9个点。

实际绘制的点只有 (2,2),(5,5) 两个点

所以如果要绘制到(1,1)(1,2)两个点需要这样设置参数

            graphics.DrawImage(imageSource,
                 new System.Drawing.Point[] {
                                            new System.Drawing.Point(-1,-1),
                                            new System.Drawing.Point(1, -1),
                                            new System.Drawing.Point(-1, 1),
                         }
             );
            graphics.DrawImage(imageSource,
                new System.Drawing.Point[] {
                                    new System.Drawing.Point(-1,0),
                                    new System.Drawing.Point(1, 0),
                                    new System.Drawing.Point(-1, 2),
                        }
            );

 

c# – 用于大图像的Graphics.DrawImage替代品

c# – 用于大图像的Graphics.DrawImage替代品

我试图在图像上绘制带有反色的十字准线(“加号”),以显示图像中所选点的位置.我是这样做的:

private static void DrawInvertedCrosshair(Graphics g,Image img,PointF location,float length,float width)
{
    float halfLength = length / 2f;
    float halfWidth = width / 2f;

    Rectangle absHorizRect = Rectangle.Round(new RectangleF(location.X - halfLength,location.Y - halfWidth,length,width));
    Rectangle absvertRect = Rectangle.Round(new RectangleF(location.X - halfWidth,location.Y - halfLength,width,length));

    ImageAttributes attributes = new ImageAttributes();
    float[][] invertMatrix =
    { 
        new float[] {-1,0 },new float[] { 0,-1,1,new float[] { 1,1 }
    };
    ColorMatrix matrix = new ColorMatrix(invertMatrix);
    attributes.SetColorMatrix(matrix,ColorMatrixFlag.Default,ColorAdjustType.Bitmap);

    g.DrawImage(img,absHorizRect,absHorizRect.X,absHorizRect.Y,absHorizRect.Width,absHorizRect.Height,GraphicsUnit.Pixel,attributes);
    g.DrawImage(img,absvertRect,absvertRect.X,absvertRect.Y,absvertRect.Width,absvertRect.Height,attributes);
}

它按预期工作,但它真的很慢.我希望用户能够使用鼠标移动选定的位置,方法是在移动时将位置设置为光标的位置.不幸的是,在我的计算机上,对于大图像,它每秒只能更新一次.

所以,我正在寻找使用Graphics.DrawImage来反转图像区域的替代方法.有没有办法以与所选区域区域而不是整个图像区域成比例的速度执行此操作?

解决方法

对我来说,你正在关注错误的问题.绘画图像很慢,不画“十字线”.

当你没有帮助时,大图像肯定会非常昂贵.而System.Drawing让人很容易找不到帮助.你想要做的两件基本事情是让图像画得更快,速度提高20倍以上是可以实现的:

>避免强制图像绘制代码重新缩放图像.而是只做一次,这样可以直接一对一地绘制图像而无需任何重新缩放.这样做的最佳时间是加载图像.可能再次出现在控件的Resize事件处理程序中.
>注意图像的像素格式.远射中最快的是像素格式,它与图像需要存储在视频适配器中的方式直接兼容.因此,图像数据可以直接复制到视频RAM,而无需调整每个像素.在99%的现代机器上,这种格式是PixelFormat.Format32bppPArgb.产生巨大的差异,它比其他所有产品快十倍.

一个简单的辅助方法,可以在不处理宽高比的情况下完成两者:

private static Bitmap Resample(Image img,Size size) {
    var bmp = new Bitmap(size.Width,size.Height,System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
    using (var gr = Graphics.FromImage(bmp)) {
        gr.DrawImage(img,new Rectangle(Point.Empty,size));
    }
    return bmp;
}

今天的关于Java Graphics.drawImage如何工作,ImageObserver的作用是什么的分享已经结束,谢谢您的关注,如果想了解更多关于(C#)graphics.drawImage有大小限制吗?怎么处理呢?、BufferedImage 类、Image 类、Graphics 类、C# GDI graphics.DrawImage 的参数问题、c# – 用于大图像的Graphics.DrawImage替代品的相关知识,请在本站进行查询。

本文标签: