Tag: graphics2d

Java:获取具有特定高度(以像素为单位)的字体

使用FontMetrics很容易确定字体的渲染高度,但另一种方法呢? 如何获得适合特定高度(以像素为单位)的字体? “给我Verdana的尺寸从上升到下降30像素高。” 我如何向Java询问此问题?

在java中获取字符串大小(没有可用的Graphics对象)

我正在尝试编写需要使用Java中的Graphics2D类绘制许多字符串的应用程序。 我需要获取每个String对象的大小(以计算每个字符串的确切位置)。 在调用paint()方法之前应该完成很多字符串,在程序开始时只执行一次(所以我还没有Graphics2D对象)。 我知道有一个方法Font.getStringBounds()但它需要一个FontRenderContext对象作为参数。 当我试图创建自己的对象时: FontRenderContext frc = new FontRenderContext(MyFont.getTransform(), true, true) 然后获取字符串边界我总是得到不同的大小比我在paint()方法中使用Graphics2D.getFontRenderContext()方法获取FontRenderContext时的大小。 差异不大(约1E-3),但我想知道为什么会有什么不同? 但是,有没有更好更安全的方法来获取字符串的大小? Thnx提前提供任何帮助!

为什么在重绘()之后不会出现方块?

我稍早发布了这个问题并且被告知要使它成为SSCCE所以这里(如果我可以做任何改进,请随时让我知道):我想知道为什么当我的按钮“确认”被点击时,旧方块消失了重新绘制的方块不会出现在我的GUI上(用swing制作)。 Squares类绘制了200个间隔开的正方形,其中ID(0,1,2或3作为字符串)从不同的类中获取(为了这个问题的目的,我们假设它总是0并且不包括该类)。 为了澄清:Squares第一次完美地绘制了所有内容(也检索了正确的ID),但是我希望它在使用新ID单击按钮后重绘所有内容。 广场代码: import javax.swing.*; import java.awt.*; import java.awt.geom.*; import java.util.ArrayList; public class Squares extends JPanel{ private ArrayList squares = new ArrayList(); private String stringID = “0”; public void addSquare(int x, int y, int width, int height, int ID) { Rectangle rect = new Rectangle(x, y, width, height); squares.add(rect); stringID = Integer.toString(ID); if(ID == […]

行没有出现在JDesktopPane上

我想在两个JPanel之间画线,但是line不出现在layeredPane上。 这就是我所做的,请仔细阅读,编译。请尝试更正此代码。 我试过这种方式在内部框架上绘制线条,但它不适用于JPanels。 package build; import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import javax.swing.JFrame; import javax.swing.JLayeredPane; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.border.LineBorder; public class LinkLayerPane1 { public static void main(String[] args) { new LinkLayerPane1(); } public LinkLayerPane1() { EventQueue.invokeLater(new Runnable() […]

Java Graphics.fillPolygon:如何渲染右边和底边?

绘制多边形时,Java2D会留下右边和底边。 我明白为什么这样做了。 但是,我想绘制一些包含这些边缘的东西。 我fillPolygon一件事是跟随具有相同坐标的fillPolygon ,但这似乎留下了空白。 (见底部的小三角形图像。)有两种可能性,但我不清楚哪一种。 要启用抗锯齿,我这样做: renderHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); renderHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g2d.setRenderingHints(renderHints); 一种可能性是在α通道上没有进行抗锯齿处理,因此间隙是由于过度绘制引起的。 在这种情况下,如果alpha通道是抗锯齿的,那么边缘将正确邻接。 另一种可能性是这里只有一个差距。 我怎样才能解决这个问题? 另外,我不确定,但看起来多边形轮廓实际上可能太大了。 也就是说,它可能比我想要包括的右边和下边更远。 谢谢。 – 更新 – 基于Hovercraft Full of Eels的一个非常好的建议,我做了一个可编辑的例子: import java.awt.Color; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JOptionPane; public class polygon { private static final int WIDTH = 20; public […]

图像质量在Java Graphics2D Rotate中被破坏

我遇到了使用Graphics2D旋转方法旋转图像的问题。 这是我遇到的问题的图像: 当我移动球时,图像在旋转时完全失真。 这是我的旋转方法: public static void rotate(BufferedImage img, Rectangle rect, int degrees) { Graphics2D g = (Graphics2D) img.createGraphics(); g.rotate(degrees, rect.x + rect.width/2, rect.y + rect.height/2); g.drawImage(img, rect.x, rect.y, rect.width, rect.height, null); g.dispose(); } 我能做些什么来避免质量损失吗?

Font.createFont将文件保存在临时目录中

下面的代码完成了它的工作,但每次运行时都会在temp目录中保留字体文件的副本。 这些文件名为+ ~JF7154903081130224445.tmp ,其中每个创建的文件的数字似乎是随机的。 InputStream fontStream = this.getClass().getResourceAsStream(“handsean.ttf”); Font baseFont = Font.createFont(Font.TRUETYPE_FONT, fontStream); fontStream.close(); 我在sun.com的论坛和网络上的其他资源中发现了数年的讨论,这被认为是JDK中的一个错误,从1.5.0_06升级到1.5.0_08可以解决问题。 但是,我使用的版本是更高版本(1.6.0_13)。 我尝试通过在完成字体相关操作后删除文件来解决问题,但此时文件被锁定。 只有在Web应用程序停止后才能删除这些文件。 有人有解决方案吗?

为什么这个图像在Java缩小后看起来如此糟糕?

这是原始图像: http : //rank.my/public/images/uploaded/orig-4193395691714613396.png 在这里,它缩小到300×225: http://sofzh.miximages.com/java/norm-4193395691714613396.png 在这里,它缩小到150×112: http://sofzh.miximages.com/java/small-4193395691714613396.png 正如你所看到的,300×225看起来非常糟糕,150×112看起来很糟糕。 这是我用来缩小图像的代码: private static BufferedImage createResizedCopy(final BufferedImage source, final int destWidth, final int destHeight) { final BufferedImage resized = new BufferedImage(destWidth, destHeight, source.getType()); final Graphics2D bg = resized.createGraphics(); bg.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); bg.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); bg.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); final float sx = (float) destWidth / source.getWidth(); final float sy = (float) […]

尽可能快地清除透明的BufferedImage

我有一个透明的BufferedImage使用以下代码创建(不相关如何创建,我认为): GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gs = ge.getDefaultScreenDevice(); GraphicsConfiguration gc = gs.getDefaultConfiguration(); Rectangle screen = transformationContext.getScreen(); // Create an image that supports transparent pixels return gc.createCompatibleImage((int) screen.getWidth(), (int) screen.getHeight(), Transparency.BITMASK); 如何在不重新创建图像的情况下以最快的方式清除图像(处于与创建状态相同的空图像)? 重新创建映像会给GC带来负担,暂停VM并冻结UI。

在Java中打印BufferedImage的正确方法

我想知道是否有一种在Java中打印BufferedImage的正确方法。 基本上我已经创建了一个工作正常的照片处理程序,我可以保存图像等。但我的真正目标是将其发送到打印机软件,以便您可以选择要打印的页面数量和页面类型。 所以我的缩短问题是,如何将缓冲的图像发送到打印机,以便弹出打印机选择屏幕等,然后才能打印? 如果有人能告诉我这方面的一个例子,我将不胜感激。