MiraiForum

    • 注册
    • 登录
    • 搜索
    • 热门
    • 最新
    • 未解决
    • 标签
    • 群组
    • 友情链接

    Graphic2D能动态调整画布的大小吗?

    技术交流板块
    5
    19
    1011
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • N
      N70_ 最后由 编辑

      如题,试图使用Grahic2D类把JSON里提取到的大量数据渲染到一张图片上,但是JSON数据变化性比较大,某个字段可能有10000条数据,也可能有8000条,这中间还有可能因为数据比较长产生换行,所以没法一开始就计算好尺寸,我想让画布可以随时动态调整大小。比如画笔y坐标超过某个值的时候就自动向右扩展一块,有什么方法吗

      1 条回复 最后回复 回复 引用 0
      • Dituon
        Dituon 最后由 编辑

        https://github.com/Dituon/petpet

        N 1 条回复 最后回复 回复 引用 0
        • X
          XDorz 最后由 编辑

          用base64编码图片传输数据再解码出图片来渲染到Graphic2D上呢?

          N 1 条回复 最后回复 回复 引用 0
          • Colter23
            Colter23 最后由 编辑

            画布创建后并不能修改大小(有两种方案 1:先生成一个默认大小的画布,绘制时如果画布不够,就新建个大点的画布,并把之前的画布绘制到新画布上。2:提前大概计算一下数据所需的大小,宽就用字体大小乘字数,高就用行数乘字体大小再乘个1.5左右(行间距),宽高最好最后再加上一些冗余。可以不用太精细,等到绘制的时候再精细计算占用大小,最后裁剪画布。

            N 1 条回复 最后回复 回复 引用 0
            • N
              N70_ @XDorz 最后由 编辑

              @XDorz 假如我的画笔y坐标超过了10000,我就把已经写入好的部分编码成base64,然后再开一张新的画布(宽度为2倍),然后把编码成base64的解码成图片渲染到这个画布上,是这个意思吗。

              1 条回复 最后回复 回复 引用 0
              • N
                N70_ @Colter23 最后由 编辑

                @Colter23
                如果是少量数据的话其实方法2加点预留足够的,但是数据变化性和量实在有点大,有的很短,有的很长,且不说精细计算,就算估计也不是很好估计。
                我试一下方法1吧

                1 条回复 最后回复 回复 引用 0
                • N
                  N70_ @Dituon 最后由 编辑

                  @Dituon mark,后面细细研究一下大佬的代码

                  1 条回复 最后回复 回复 引用 0
                  • Colter23
                    Colter23 最后由 编辑

                    这有什么不好估计的(还有为啥要转成base64.。BufferedImage可以直接当成图片绘制的(

                    N 2 条回复 最后回复 回复 引用 0
                    • Colter23
                      Colter23 最后由 Colter23 编辑

                      如果数据实在太多,转成图片不是很好。可能造成图片过于庞大(像你说的动不动就几千条数据,那图片要多大啊(

                      N 1 条回复 最后回复 回复 引用 0
                      • RainChan
                        RainChan 摸鱼 最后由 编辑

                        也许用浏览器绘制图片也是可行的办法,如果需要经常绘制图片可以将浏览器放到后台保持运行降低进程启动开销

                        N 2 条回复 最后回复 回复 引用 0
                        • N
                          N70_ @Colter23 最后由 N70_ 编辑

                          @Colter23 BufferImage好像Heap Memory容易爆掉,不好估计是因为难以预料哪一个长度比较长会换行,而且数据比较多,也不好估计范围,全部按照最大的来就会爆内存或者浪费留下很多空白

                          1 条回复 最后回复 回复 引用 0
                          • N
                            N70_ @Colter23 最后由 编辑

                            @Colter23 成千上万条数据是我夸张了, 按行数来说的话确实得有几百或者一千行左右。我试了一下尺寸大概能到5000*10000像素(大概5 6MB这样)这么大。
                            其实想转成图片就是因为字符太多,用消息发有点不方便2333

                            1 条回复 最后回复 回复 引用 0
                            • N
                              N70_ @RainChan 最后由 编辑

                              @RainChan mark,我去学习一下这个方法

                              1 条回复 最后回复 回复 引用 0
                              • N
                                N70_ @RainChan 最后由 编辑

                                @RainChan 请教一下大佬,用浏览器绘制图片是怎么做的?该需要用到什么工具呢或者有什么搜索关键词吗

                                RainChan 1 条回复 最后回复 回复 引用 0
                                • N
                                  N70_ @Colter23 最后由 编辑

                                  @Colter 我尝试了一下大佬说的每次新建更大的画布然后把之前的画布绘制到新画布的方法,结果内存爆了……

                                  1 条回复 最后回复 回复 引用 0
                                  • RainChan
                                    RainChan 摸鱼 @N70_ 最后由 编辑

                                    @N70_ 论坛有人写过

                                    N 1 条回复 最后回复 回复 引用 0
                                    • N
                                      N70_ @RainChan 最后由 编辑

                                      @RainChan 我找到了这2个:
                                      Mirai Selenium Plugin,前置插件,用于使用Selenium调用浏览器进行截图等操作
                                      还有一个是楼上大佬项目里使用的Skiko
                                      是这两个嘛

                                      RainChan 1 条回复 最后回复 回复 引用 0
                                      • RainChan
                                        RainChan 摸鱼 @N70_ 最后由 编辑

                                        @N70_ 是

                                        1 条回复 最后回复 回复 引用 0
                                        • Dituon
                                          Dituon 最后由 Dituon 编辑

                                          可以先计算文字的宽高, 再创建对应大小的画布

                                          https://github.com/Dituon/petpet/blob/main/src/main/java/xmmt/dituon/share/TextModel.java#L201-L243

                                          1 条回复 最后回复 回复 引用 0
                                          • 1 / 1
                                          • First post
                                            Last post
                                          Powered by Mamoe Technologies & NodeBB | 友情链接 | 服务监控 | Contact