代码之家  ›  专栏  ›  技术社区  ›  Mark Giaconia

JAVA,如何从X、Y坐标列表中生成PNG

  •  0
  • Mark Giaconia  · 技术社区  · 7 年前

    我有这样的数据(最终是双倍坐标)

    x,y
    ===
    1.1,2.3
    2.9,5.4
    7.9,8.1
    

    我需要做的是从这些坐标中生成一个简单的PNG,在白色背景上以黑点的形式显示这些坐标(稍后我将调整颜色)。

    我已经搜索了很多,而且我还不太熟悉Java的图像“东西”,所以我想知道是否有人能帮上忙。

    这是我到目前为止发现的,但我不能用双打和这个,我不知道如何绕过这个点。由于环境原因,我尽量远离外部库。

    final BufferedImage image = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB);   
    
     final Graphics2D graphics2D = image.createGraphics();
        graphics2D.setPaint(Color.WHITE);
        graphics2D.fillRect(0, 0, 1000, 1000);
        graphics2D.setPaint(Color.BLACK);
        graphics2D.drawOval(0, 0, 1000, 1000);
        graphics2D.dispose();
    

    有人有什么建议吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   SilverMonkey    7 年前

    我建议你用 boolean[][] 以存储像素。使用双倍存储坐标是一种可怕的内存浪费。我建议采取以下办法:

    boolean[][] pixBool;
    BufferedImage img;
    
    for(int a = 0; a < pixBool.length;a++){
        for(int b = 0; b < pixBool[0].length;b++){
            boolean pix = pixBool[a][b];
            if(pix){
                img.setRGB(a,b,0xff000000);  
            }
        }
    }
    

    在这种情况下,白色(0xffffffff)像素将作为false存储在pixbool数组中,而黑色(0xff000000)像素将作为true存储。因此,在数组初始化之后,整个图像将是白色(背景)。图像将通过操作给定的 BufferedImage 通过 setRGB() 方法。

    如果确实需要使用double,可以转换它们,然后使用上述方法:

    double[] coordinates;
    for(int c = 0; c < coordinates.length; c++){
        double coord = coordinates[c];
        BigDecimal x = BigDecimal.valueOf((int)coord);
        BigDecimal y = BigDecimal.valueOf(coord);
        y = y.subtract(x);
        y = y.scaleByPowerOfTen(y.scale);
        pixBool[(int)x.longValue()][(int)y.longValue()] = true;
    }
    

    要提取x坐标,只需提取double的整个部分,这可以通过将其转换为int来轻松完成,从而丢失小数部分。 y坐标是个棘手的部分。由于double的不确定性,您必须使用bigdecimal类。一开始你必须提取数字的小数部分,因为那是你的坐标被存储的。这可以通过减去数字的整个部分来实现。之后,必须将提取的小数部分缩放为整数。这是通过与10相乘得到点后位数的幂(比例法)来实现的。之后,只需从bigdecimal类中提取计算出的数字,就完成了。

    您还可以使用更直截了当的方法利用string类:

    double[] coordinates;
    for(int c = 0; c < coordinates.length; c++){
        double coord = coordinates[c];
        String temp = String.valueOf(coord);
        String [] temp2 = temp.split(".");
        int x = Integer.valueOf(temp2[0]);
        int y = Integer.valueOf(temp[1]);
        pixBool[x][y] = true;
    }
    

    在这种情况下,首先将坐标转换为 String 然后把它分成小数点。这会给你一个 String[] 有两个条目:数字的整个部分(即x坐标)和小数部分(即y坐标)。然后只需将字符串转换回int,然后使用它们填充布尔值[]。