JavaFX SVGPath内容很大,速度很慢

时间:2018-02-06 15:57:23

标签: java svg javafx

我正在使用大量的点(4096x256)作为JavaFX应用程序中的图像显示。我开始使用由2D点阵构建的BMP图像,但缩放操作在屏幕上产生模糊图像。因此,我决定使用SVGPath来绘制我的图像,现在可以使用简单的SVGPath内容正确放大(无模糊),但在显示两种颜色的棋盘时变得非常慢,可能是因为SVGPath内容太大了失败位信息,如我的代码所示。 有没有一种有效的方法来实现这一目标?通过高效,我的意思是快速执行时间,同时保持像素锐利的缩放效果。

public Group createImage(final int width, final int height, final int boxIdx)
  {
   // assuming that pass data bits are more numerous than others, we can
   // start by drawing full green colored lines
   StringBuilder svgPass = new StringBuilder();
   for (int y = 0; y < height; y++)
   {
    svgPass.append("M0,");
    svgPass.append(Integer.toString(y));
    svgPass.append(" ");
    svgPass.append("L0,");
    svgPass.append(Integer.toString(y));
    svgPass.append(" ");
    svgPass.append(Integer.toString(width - 1));
    svgPass.append(",");
    svgPass.append(Integer.toString(y));
    svgPass.append(" z");
   }

   SVGPath imgPass = new SVGPath();
   imgPass.setContent(svgPass.toString());
   imgPass.setStrokeLineJoin(StrokeLineJoin.BEVEL);
   imgPass.setStroke(Color.GREEN);
   imgPass.setStrokeWidth(1);

   // fail data bits
   StringBuilder svgFail = new StringBuilder();
   Bit[][] bits = WordLineManager.getInstance().getBlocksMap().get(boxIdx);

   for (int y = 0; y < bits.length; y++)
   {
    for (int x = 0; x < bits[0].length; x++)
    {
     if (bits[y][x].getNature() == BitNature.DATA && !bits[y][x].getStatus())
     {
         svgFail.append("M");
         svgFail.append(Integer.toString(x));
         svgFail.append(",");
         svgFail.append(Integer.toString(y));
         svgFail.append(" ");
         svgFail.append("L");
         svgFail.append(Integer.toString(x));
         svgFail.append(",");
         svgFail.append(Integer.toString(y));
         svgFail.append(" ");
         svgFail.append(Integer.toString(x + 1));
         svgFail.append(",");
         svgFail.append(Integer.toString(y));
         svgFail.append(" z");
     }
    }
   }

   SVGPath imgFail = new SVGPath();
   imgFail.setContent(svgFail.toString());
   imgFail.setStrokeLineJoin(StrokeLineJoin.BEVEL);
   imgFail.setStroke(Color.RED);
   imgFail.setStrokeWidth(1);

   return new Group(imgPass, imgFail);
  }

0 个答案:

没有答案