问题标签 [graphics32]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - Graphics32 - 将透明绘图层保存为 png
我在 ImgView32 的一层上画了一条虚线。稍后,我想将每一层保存为透明的 PNG。对于我拥有的任何其他图层,保存效果很好。但是对于绘图层,它没有。
为了使问题更易于理解,请从 gr32 库中获取示例代码,更具体地说是 Layers 示例。其主菜单中的选项之一是添加自定义绘图层(新建自定义层 -> 简单绘图层)。然后尝试将该图层保存为透明的 PNG 图像,您最终会得到一个损坏的 PNG 文件(您无法使用任何其他图片查看器打开它,例如 Paint.net 或 Microsoft Photo Viewer)。如果您尝试将图层的 bitmap32 保存为位图,则会发生同样的事情,如下面的代码所示......
我尝试了两种将 Bitmap32 保存为透明 PNG 的方法,所以第一种方法如下:
因此,如果我像这样将 PNG 加载到图层中,则上述方法有效:
但是,一旦我尝试保存使用 Layers 示例中的代码创建的层,结果就会损坏。即使我尝试将图层保存为这样的位图(尽管这不是我的意图,因为我需要它们是 PNG):
发生同样的腐败。所以,这不像我收到异常或任何东西......它只是以某种方式被保存损坏;
我还尝试了其他方法将 Bitmap32 保存为透明 PNG,例如 GR32_PNG 方法:
在哪里
但是使用这种方法,我在尝试保存这个特定层时得到了 EAccessViolation。对于任何其他图层(不是绘图图层),它不会使我的项目崩溃,除了这个自定义绘图。访问冲突发生在这一行:
png.分配(BM);
Bitmap32ToPNG 函数内部
您知道为什么会发生这种情况,我该如何防止这种情况发生?
编辑
我尝试改用 TBitmapLayer,因为 TPositionedLayer 可能由于某种原因缺少 Bitmap32。所以我的代码是这样的:
请记住,我使用默认图层演示应用程序。所以这只是添加的代码。我没有删除或更改演示代码中的任何内容。所以我创建了一个新图层(TBitmapLayer)并在 onPaint 上绘制。最后我想将该图层的内容保存为PNG。但似乎 onPaint 可能会在其他地方而不是实际图层上绘制。否则我不明白为什么保存的图像是空的。所以这次生成的PNG没有损坏,但它是空的......
delphi - Graphics32 图层旋转
我正在尝试将 RotationLayer 与常规 TBitmapLayer 结合起来,以便能够尽可能地使用 ImgView32 图层。
所以我的想法是:
- 我有一个 TBitmapLayer(我需要它是 BitmapLayer,因为我用它做的不仅仅是旋转)。它加载了 BMP 图像
- 我在表单上放置了一个 TGaugeBar(就像 GR32 示例中的一样)
- 当鼠标按下该仪表时,我开始进行计算:我创建一个 RotationLayer,在其中放置原始 BitmapLayer.Bitmap 的内容
- 仪表的 OnChange,我使用在 MouseDown 中创建的 RotLayer 对象并给它一个角度,并将选择分配为 TBitmap,RotLayer.Bitmap
- 在 MouseUp 上,我释放了使用的临时 RotationLayer 对象
所以基本上:将图像从实际层移动到临时旋转层,在那里进行旋转,然后,完成后,将旋转后的图像移回 BitmapLayer ...
所以最后,我的逻辑似乎有效,除了我需要使用另一个 SO 问题中提供的函数手动在 BitmapLayer 上进行实际旋转(链接如下)。因为看起来rotationLayer实际上并没有旋转它的位图中的图像。它似乎只显示它旋转...
现在我的问题是:
- 我需要能够“调整”原始 TBitmapLayer 的大小,这样它就不会裁剪旋转的图像以适合旧的 BitmapLayer
- 显示rotationLayer 时,我使用BitmapCenter 将其显示在初始BitmapLayer 的顶部(我找不到另一种将其定位在我想要的位置的方法)。然而这个 BitmapCenter 似乎有两种用途:一种是定位图层,另一种是设置旋转所围绕的点。我怎样才能仍然将旋转层精确地定位在原始 BitmapLayer 的顶部,并且仍然在 Bitmap 中间有 BitmapCenter(旋转中心)?
- 似乎当我开始旋转时,旋转层被创建并加载了我的位图,我认为 alphaChannel 发生了一些事情,因为我认为图像变得有点暗和半透明,每次我将 BitmapLayer.Bitmap 分配给 RotationLayer .位图。我注意到,通过注释 MasterAlpha:=200 行,图像不会失去亮度,但现在当 RotationLayer 可见时,图层矩形的空白部分变为黑色。所以看起来很糟糕......而且当我执行 MouseUP 时(所以当我将旋转的位图分配给 BitmapLayer.Bitmap 时,一些黑线在旋转图像的外部仍然可见,因此在空白区域中)。关于如何保持原始图像干净的任何建议?
请帮助我解决这三个问题。
到目前为止的工作代码是:
RotateBitmap 函数是从这个SO question中挑选出来的
旋转透明图像时也存在问题...使用上面的代码自行测试它们并加载一些具有透明度的PNG,您就会理解问题所在。
delphi - Graphics32 层性能问题
我使用 graphics32 库在 Delphi 中开发了一个应用程序。它涉及向 ImgView32 控件添加层。它现在可以满足我的所有需求,除了当用户向 ImgView 添加超过 25-30 层时,所选层开始表现不佳。我的意思是,-当 ImgView32 上有 30 多个图层并且我单击一个图层时,实际选择它大约需要 2.5-2 秒。- 此外,当我尝试移动图层时,它会突然移动
当有更多层时,似乎 ImgViewChange 被调用了太多次。PaintLayer 也是如此。它被调用太多次了。我怎样才能阻止这种情况发生?即使添加了超过 30 个图层,我如何才能使图层优雅地移动?
我的代码如下:
因此,只需多次单击按钮(30 次),一旦添加了 25-30 层,您就会注意到异常行为。(当然使用库中层示例中的基本代码并添加上述程序)
也许解决方案是在某处禁用 ImgViewChange 事件的触发。但我不知道在哪里做……或者我错了。
请给我一个解决这个问题的方法......因为我想不出任何东西......
编辑
这是一个可以更好地解释的屏幕截图:
正如您在 imgView 的右侧看到的,有 3 个编辑框。第一个告诉我们已经添加了 25 层。另外两个也是不言自明的。在图片的左侧,您可以看到那里绘制的图层。它们都是一样的,都是用代码中的paintHandler绘制的。所以所有层都是相同的
现在考虑这种情况:没有选择图层,然后我开始单击图层,前 3 次单击显示 ImgViewChange=52 和 Paint=26,每个图层。然后在我第四次单击图层时,值就是此处显示的图像中的值。这没有任何意义。所以 ImgViewChanged 被调用了 1952 次, PaintHandler 被调用了 976 次。某处一定有一个错误......请帮我解决这个问题。考虑到这些编辑框已填写在上面的代码中。同样在这个测试项目中,没有其他代码可以做这种疯狂的行为。我只使用使其工作所需的代码编写了这个测试项目。所以代码在上面,行为在图片中。
编辑 在 PaintHandler 方法中添加 bmp32.BeginUpdate 和 bmp32.EndUpdate 后,重绘和 imgViewChanges 的数量似乎减少了,但没有减少很多。现在我得到 ImgViewChange=1552 和 PaintHandler=776。我什至不确定这是因为我的改变,因为这些数字看起来几乎是随机的。我的意思是我不知道它为什么会发生,谁会定期触发这些事件,以及当它们被触发这么多次时会发生什么?
当我将所有 25 个图层添加到 imgView 时,我将它们留在添加它们的位置:在视图的中心。全部添加后,我开始单击每个并将它们拖离中心,以便它们都可见。
现在,我单击并从中心拖动的前 15-20 层,我监控的 2 个数字(这两个事件被触发的次数)比我想要的第 20 层之后得到的数字低很多从中心拖动。当它们都分散在视图中之后,它就开始了:一些图层可以实时点击,其他图层需要一段时间才能被选中,而我对事件触发的计数已经超过了屋顶。
编辑
我发现了我的问题。有了这个,我将被触发的事件数量减少到正常数量。所以解决方案是为图层位图的分配添加 BeginUpdate 和 EndUpdate ......所以在 PaintHandler 我将代码更改为:
现在我的图层表现得像他们应该的那样。感谢 SilverWarrior 为我指明了正确的方向。请将您的评论转换为答案,以便我接受。
delphi - 如何在 Graphics32 库中绘制矢量圆角矩形?这可能吗?
如何在 Graphics32 库中绘制矢量圆角矩形?这可能吗?
不是栅格,应该是矢量。
delphi - Graphics32:调整很多图像的大小
2016 年 3 月 24 日我 76 岁,当我写这篇文章时,我认为这是有道理的,但和其他人一样,我不确定我在问什么。这是我在网上搜索时拼凑起来的(它并不漂亮)。它几乎可以工作,唯一缺少的是保留纵横比。它使高大的照片看起来很胖。在 40 年的编程生涯中,我可能总共有两个小时的时间来编写图形代码。:)
2016 年 3 月 23 日,我在这里听取了一位好心人的建议,用 Graphis32 咬紧牙关,很高兴我做到了,但碰壁了。我在数据库中有大约 1200 张图像的路径,并且在显示、保存等方面一切顺利。
有些图像在 6 到 9MB 之间,不需要存储那么大,因为它们只能在 PC 屏幕上查看。我想将它们减小到所需的大小,例如 1920 x 1080 并保留 H x W 比率。如果图像已经小于 1920 x 1080,我不想缩小图像。
我做了很多搜索和反复试验,到目前为止只有错误。当用户手动工作时,我在缩放和/或旋转后有保存部分。但我希望能够扫描整个数据库并即时更改大小。
一个代码片段会很棒。
delphi - 如何使用不可见的 TImage32
我尝试使用 TImage32 将多个图层与位置和透明度等结合起来。所以我在运行时创建了一个 TImage32,将父级设置为 nil,从文件加载位图并从文件加载该位图之上的图层。现在我想保存结果,但我似乎无法找到实际结果在哪里。如果我在设计时创建 TImage32,使其可见,则组合位图的结果在 TImage32 的 Buffer 字段中,我可以使用 Image32.Buffer.SaveToFile('test.bmp') 保存结果。如果组件不可见,则 Buffer 是一个空位图,并且似乎没有创建组合位图。
有人可以解释一下吗?如何将位图与 GR32 结合,保存它们,但使用不可见的组件?
非常感谢!威廉
delphi - 在 Delphi XE 中渲染混合矢量和位图图像的最佳方法是什么
delphi - 有没有办法绕过 Graphics32 16 位数学限制?
我有一个 CAD 应用程序,它使用 Graphics32 (1.9.1) 使用 PolygonTS 绘图例程绘制多边形。
当一切都在画布上时一切正常,当放大对象时问题就来了。
我可以检查多边形的所有点是否都在屏幕外并且不绘制它,当绘制部分在屏幕上的多边形时出现问题。
Graphics32 似乎使用了一个定点顶点数学方案 (Tfixedpoint),它有效地将它可以处理的像素数减少到 65536(16 位)。如果正在绘制的多边形上的某个点超过此值,则数学溢出并且在屏幕上绘制伪影。
这发生在相当适度的变焦上,我无法想象这个问题以前没有遇到过,但粗略的搜索却一无所获。必须手动剔除多边形将否定 GR32 的使用。
是否有使用 32 位数学的 GR32 的替代多边形绘图库?