哪种方法是使用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, …我有一个自定义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}; …给定具有X点的2D空间,如何有效地找到放置固定大小矩形的位置,以便它覆盖那些X点的最大可能数量?
我需要沿着这些线条在我正在构建的2D游戏中定位视口.
使用时很容易确定字体的渲染高度FontMetrics,但另一种方法呢?如何获得适合特定高度(以像素为单位)的字体?
"给我
Verdana一个从上升到下降30像素高的大小."
我如何向Java询问此问题?
我正在编写一个简单的程序来测试基本的GUI.程序在屏幕中间打印一个字母,允许用户使用箭头键移动它.一切正常,但是当我尝试在程序开头处将字母居中时,似乎getWidth和getHeight函数没有返回正确的数字.
这是包含我的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();
            }
        }); …提前谢谢你的帮助
描述:程序绘制,显示和保存图像.它的工作原理如下:对象本身扩展了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 …所以我正在创建一个侧卷轴,我正在尝试在另一个图像的点处绘制图像.
我的背景图像是5000 x 500,让我说我想在500,50的背景图像上绘制一个25x25的图像.我该怎么办?
到目前为止,我已经尝试过:
Coins c = new Coins(img.getWidth(this) - 4500, img.getHeight(this) - 250);
但是这只是将它绘制在帧的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 …我写了一个粒子系统小程序; 目前我正在创建,并分别绘制每个粒子.(这是代码)
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());
            }
    }
} …graphics2d ×10
java ×8
swing ×6
algorithm ×2
awt ×2
c# ×1
fontmetrics ×1
fonts ×1
gdi+ ×1
geometry ×1
graphics ×1
image ×1
intersection ×1
java-2d ×1
jpanel ×1
keylistener ×1
math ×1
performance ×1
pixel ×1
scala ×1
transform ×1
winforms ×1