标签: graphics2d

用Java绘制像素图像

哪种方法是使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

java swing pixel graphics2d paintcomponent

7
推荐指数
2
解决办法
2万
查看次数

使用矩阵单独旋转矩形

有一点绘图复杂,你会称之为.当谈到矩阵并在形状上绘制旋转时,我的数学有点生疏.这是一些代码:

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 + …
Run Code Online (Sandbox Code Playgroud)

c# math gdi+ graphics2d winforms

7
推荐指数
1
解决办法
2万
查看次数

Graphics2D转换结果与手动转换不匹配

我使用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)
   }
Run Code Online (Sandbox Code Playgroud)

预期的行为

蓝色矩形(手动计算)透过红色矩形(通过变换计算).

经验丰富的行为

蓝色矩形的偏移量为1

我承认我的transformationMatrix并不是真正的整数,但那应该不是问题,不是吗?

   affineTransform = 1.1, …
Run Code Online (Sandbox Code Playgroud)

java swing scala transform graphics2d

7
推荐指数
2
解决办法
690
查看次数

带有TexturePaint的图标会抛出InternalError:Surface无法缓存

我有一个自定义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)
Run Code Online (Sandbox Code Playgroud)

重现问题的代码:

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}; …
Run Code Online (Sandbox Code Playgroud)

java swing awt java-2d graphics2d

7
推荐指数
1
解决办法
199
查看次数

找到矩形位置,使其覆盖2D空间中的最大点

给定具有X点的2D空间,如何有效地找到放置固定大小矩形的位置,以便它覆盖那些X点的最大可能数量?

我需要沿着这些线条在我正在构建的2D游戏中定位视口.

algorithm graphics geometry intersection graphics2d

7
推荐指数
1
解决办法
1572
查看次数

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

使用时很容易确定字体的渲染高度FontMetrics,但另一种方法呢?如何获得适合特定高度(以像素为单位)的字体?

"给我Verdana一个从上升到下降30像素高的大小."

我如何向Java询问此问题?

java fonts graphics2d fontmetrics

6
推荐指数
3
解决办法
1万
查看次数

为什么我不能访问我的面板的getWidth()和getHeight()函数?

我正在编写一个简单的程序来测试基本的GUI.程序在屏幕中间打印一个字母,允许用户使用箭头键移动它.一切正常,但是当我尝试在程序开头处将字母居中时,似乎getWidthgetHeight函数没有返回正确的数字.

这是包含我的Panel类的片段

static class LinePanel extends JPanel{
    int xCenter = getWidth() /2;
    int yCenter = getHeight() /2;

    private int x = xCenter;
    private int y = yCenter;
    private char keyChar = 'A';

    public LinePanel(){
        addKeyListener(new KeyAdapter(){
            public void keyPressed(KeyEvent e) {
                switch (e.getKeyCode()) {
                    case KeyEvent.VK_DOWN: y += 10; break;
                    case KeyEvent.VK_UP: y -= 10; break;
                    case KeyEvent.VK_LEFT: x -= 10; break;
                    case KeyEvent.VK_RIGHT: x += 10; break;
                    default: keyChar = e.getKeyChar();
                }

                repaint();

            }
        }); …
Run Code Online (Sandbox Code Playgroud)

java swing keylistener jpanel graphics2d

6
推荐指数
2
解决办法
1万
查看次数

Java BufferedImage使用不需要的背景颜色进行保存

提前谢谢你的帮助

描述:程序绘制,显示和保存图像.它的工作原理如下:对象本身扩展了Frame.在构造函数中,该对象创建一个BufferedImage,并调用一个绘制到该图像上的方法.然后,它将图像显示在帧上.最后,它将图像保存到文件中(我不关心它使用的是什么格式).主程序创建对象,其余部分完成.

问题:保存的文件始终具有彩色背景!由于显示的图像很好,这尤其奇怪.如果我在ImageIO.write()中使用"jpg"格式,背景会偏红.如果我使用"png"格式,背景为深灰色.

我花了一段时间在这上面,我仍然不知道到底发生了什么!

    import java.awt.Frame ;
    import java.awt.image.BufferedImage ;
    import java.io.IOException ;
    import java.awt.event.WindowEvent ;
    import java.awt.event.WindowAdapter ;
    import java.awt.Toolkit ;
    import java.awt.Graphics2D ;
    import java.awt.Graphics ;
    import java.awt.Color ;
    import java.awt.Dimension ;
    import javax.imageio.ImageIO ;
    import java.io.File ;
    import java.awt.geom.Rectangle2D;

    public class HGrapher extends Frame{
       private BufferedImage img ;
       private float colors[][] ; //the colors for every rectangle
       private double availWidth ;
       private double availHeight ;


       public HGrapher(String saveFileName, int numRects) throws IOException {
          //*add window closer
          addWindowListener(new …
Run Code Online (Sandbox Code Playgroud)

java swing bufferedimage graphics2d javax.imageio

6
推荐指数
1
解决办法
5690
查看次数

在另一个图像的点处绘制图像

所以我正在创建一个侧卷轴,我正在尝试在另一个图像的点处绘制图像.

我的背景图像是5000 x 500,让我说我想在500,50的背景图像上绘制一个25x25的图像.我该怎么办?

到目前为止,我已经尝试过:

Coins c = new Coins(img.getWidth(this) - 4500, img.getHeight(this) - 250);
Run Code Online (Sandbox Code Playgroud)

但是这只是将它绘制在帧的500,50处,因此当我向右滚动时它会在图像上"移动".我想,在向右滚动一次之后,硬币图像在500,50的图像上绘制仍然是495,50帧.

我也可以使用背景图像的getGraphics并将较小的图像绘制到它上面,但我认为因为我设置了在创建对象期间绘制的点,我不能这样做.

角色不会移动,除了上下,只有背景滚动,所以我希望硬币像背景一样移动.

图片:(无法嵌入,因为我没有10个代表点) http://dl.dropbox.com/u/47632315/char.png http://dl.dropbox.com/u/47632315/coin .png http://dl.dropbox.com/u/47632315/sideScrollerBG.png

和SSCCE:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.awt.image.ImageObserver;
import java.io.IOException;
import javax.imageio.ImageIO;

public class SideScroller extends JPanel implements KeyListener {

    public static void main(String args[]) throws Exception {
        SideScroller f = new SideScroller("Side Scroller");
    }

    JFrame f = new JFrame();
    int x = 0;
    int y = 0;
    int k = 10;
    int j …
Run Code Online (Sandbox Code Playgroud)

java swing image awt graphics2d

6
推荐指数
1
解决办法
428
查看次数

有效地绘制大量粒子

我写了一个粒子系统小程序; 目前我正在创建,并分别绘制每个粒子.(这是代码)

BufferedImage backbuffer;
Graphics2D g2d;

public void init(){
    backbuffer = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
    g2d = backbuffer.createGraphics();
    setSize(WIDTH, HEIGHT);

    //creates the particles
    for (int i = 0; i < AMOUNTPARTICLES; i++) {
        prtl[i] = new particleO();
        prtl[i].setX(rand.nextInt(STARTX));
        prtl[i].setY(rand.nextInt(STARTY));
        prtl[i].setVel(rand.nextInt(MAXSPEED)+1);
        prtl[i].setFAngle(Math.toRadians(rand.nextInt(ANGLESPREAD)));

        }

    //other code
}



    public void update(Graphics g) {        

    g2d.setTransform(identity);

    //set background
    g2d.setPaint(BGCOLOUR);
    g2d.fillRect(0,0,getSize().width,getSize().height);
    drawp();
    paint(g);           
    }


public void drawp() {

    for (int n = 0; n < AMOUNTPARTICLES; n++) {

    if (prtl[n].getAlive()==true){
            g2d.setTransform(identity);
            g2d.translate(prtl[n].getX(), prtl[n].getY());
            g2d.setColor(prtl[n].getColor());

            g2d.fill(prtl[n].getShape());


            }
    }

} …
Run Code Online (Sandbox Code Playgroud)

java algorithm performance graphics2d

6
推荐指数
1
解决办法
1502
查看次数