我正在使用Java的Graphics2D来生成图形的图形表示.我也在使用ImageIO来编写PNG文件.(ImageIO.write(image, "png", out);)
我想知道如何编写JUnit测试来测试生成的图形是否符合预期.我可以预先生成PNG文件,但如果在不同的机器上字体有点不同怎么办?
我在Java中尝试使用Graphics2D.但像往常一样,我被困住了.:P问题是:假设我有这个代码,
Graphics2D g=(Graphics2D)(this.getGraphics()); //Inside a JFrame
g.rotate(Math.PI/8);
g.drawLine(10, 20, 65, 80);
//I want this one and all following lines to be drawn without any rotation
g.drawLine(120, 220, 625, 180);
可能吗???我知道必须有某种方式,但我无法弄清楚.请帮忙.
我正在用g.drawString(str, x, y)一个Graphics2D对象绘制一个String g.当前的字体g不包括所有字符str(我在那里有例如中文字符).在Mac OS X上,似乎会自动使用后备字体,但不会在Windows上显示黑色方形轮廓,而不是所需的字符.
(例如,那里有一个很好的字体.)
更新/更多信息
因此,不支持所有字符的原始字体不是JVM的逻辑字体之一,而是我的应用程序随附的捆绑字体Font.createFont().因此,将字体添加到JRE的lib/fonts/fallback文件夹在此处不起作用.
我正在尝试构建一个简单的绘图工具.该mouseDrag事件创建一个新的椭圆形,并导致我JPanel到repaint().
这到目前为止工作正常.但是,如果我mouseDrag在第一次触发事件之前按下任何按钮(或任何其他UI组件),则按钮将绘制在我面板的左上角.
我已将代码隔离到此测试应用程序中:
import java.awt.BasicStroke;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test extends JFrame
{
    public Test()
    {
        final JPanel paintPanel = new JPanel(){
            @Override
            protected void paintComponent(Graphics g)
            {
                Graphics2D g2d = (Graphics2D)g;
                g2d.setPaintMode();
                g2d.setStroke(new BasicStroke(1));
                g2d.fillRect(100, 100, 10, 10);
            }
        };
        paintPanel.setPreferredSize(new Dimension(300,300));
        paintPanel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                paintPanel.repaint();
            }
        });
        this.setLayout(new …哪种方法是使用java创建像素图像的最佳方法.比如,我想创建一个尺寸为200x200的像素图像,总共为40.000像素.如何从随机颜色创建像素并将其渲染到JFrame上的给定位置.
我试图创建一个只创建像素的自己的组件,但是如果我使用for循环创建这样一个像素250,000次并将每个实例添加到JPanels布局中,这似乎不是非常高效.
class Pixel extends JComponent {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(getRandomColor());
        g.fillRect(0, 0, 1, 1);
    }
}
有一点绘图复杂,你会称之为.当谈到矩阵并在形状上绘制旋转时,我的数学有点生疏.这是一些代码:
private void Form1_Paint(object sender, PaintEventArgs e)
    {
        g = e.Graphics;
        g.SmoothingMode = SmoothingMode.HighQuality;
        DoRotation(e);
        g.DrawRectangle(new Pen(Color.Black), r1);
        g.DrawRectangle(new Pen(Color.Black), r2);
        // draw a line (PEN, CenterOfObject(X, Y), endpoint(X,Y) )
        g.DrawLine(new Pen(Color.Black), new Point((r1.X + 50), (r1.Y + 75)), new Point((/*r1.X + */50), (/*r1.Y - */25)));
        this.lblPoint.Text = "X-pos: " + r1.X + " Y-pos: " + r1.Y;
        //this.Invalidate();
    }
    public void DoRotation(PaintEventArgs e)
    {
        // move the rotation point to the center of object
        e.Graphics.TranslateTransform((r1.X + 50), (r1.Y + …我使用Java的Graphics2D在一个组件上使用AffineTransform来操作我的绘图.Graphics2D为此提供了一个方法转换,它采用了AffineTransform.
有时我需要手动操作一个点而不使用内置转换.但是当我尝试使用相同的变换转换一个点时,我给了Graphics2D.transform有时结果点不一样.
下面的代码重现了这个问题(它是Scala代码,但我认为你可以想象Java代码.):
   var transformationMatrix = new AffineTransform()
   /*
    * transformationMatrix is modified throughout the program
    * ...
    */
   override def paintComponent(g: Graphics2D) = {
      super.paintComponent(g)
      /* 1. transform using graphics transform */
      g.transform(transformationMatrix)
      g.setColor(Color.RED)
      g.fill(new Rectangle(0, 0, 1, 1))
      /* 2. transform point manually */
      g.setTransform(new AffineTransform) // reset transformation to standard
      val p0 = new Point(0, 0)
      val pDest = new Point()
      transformationMatrix.transform(p0, pDest)
      g.setColor(Color.BLUE)
      g.fill(new Rectangle(pDest.x, pDest.y, 1, 1)
   }
预期的行为
蓝色矩形(手动计算)透过红色矩形(通过变换计算).
经验丰富的行为

我承认我的transformationMatrix并不是真正的整数,但那应该不是问题,不是吗?
   affineTransform = 1.1, …背景:我需要能够以"禁用"外观创建图像.通常建议的方法是将图像转换为灰度并显示灰度图像.缺点是它只适用于图像,因此显示图形很麻烦,因为您无法立即访问处于禁用状态的图像.现在我认为这可以使用java.awt.Composite动态完成(然后我不需要知道如何实现一个Icon来禁用它).似乎没有实现转换为灰度,所以我必须创建自己的......
也就是说,我将一个实现混合在一起(并且它呈现了我所期望的).但我不确定它是否真的适用于所有情况(复合/ CompositeContext的Javadocs对于这样一个复杂的操作看起来非常薄).正如你从我的实现中看到的那样,我采用了一种迂回的方式来逐像素处理,因为似乎没有简单的方法来批量读取/写入像素,而这种格式不是由所涉及的栅格决定的.
欢迎任何指向更广泛的文档/示例/提示的指针.
这是SSCCE - 它通过DisabledComposite渲染(彩色)GradientPaint,将渐变转换为灰度.请注意,在现实世界中,您将无法知道通过哪些调用呈现的内容.Gradient实际上只是一个例子(对不起,但是人们常常没有这样做,所以这次我会明确说明).
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Composite;
import java.awt.CompositeContext;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.ColorModel;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class CompositeSSCE implements Runnable {
    static class DisabledComposite implements Composite {
        @Override
        public CompositeContext createContext(
            final ColorModel srcColorModel,
            final ColorModel dstColorModel,
            final RenderingHints hints) {
            return new DisabledCompositeContext(srcColorModel, dstColorModel);
        }
    } 
    static class DisabledCompositeContext implements CompositeContext {
        private …我有一个自定义Icon其使用TexturePaint的油漆,并调用fillPolygon一个上Graphics2D对象.
这段代码在JDK6和JDK7上运行良好,但在64位Linux的JDK8下失败(在64位Linux上尝试了最新的JDK1.8).在Windows上,这适用于JDK8.
java -version用于重现问题的JDK命令的输出.
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
重现问题的代码:
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
public class TexturePaintIconTest {
  private static class CustomIcon implements Icon{
    private static final int[] sXArray = new int[]{2, 5, 7, 12, 12, 4, 1, 1, 2};
    private static final int[] sYArray = new int[]{4, 4, 2, 2, 11, 11, 8, 5, 4}; …