问题标签 [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.

0 投票
0 回答
350 浏览

delphi - Delphi Graphics32 - 编辑图层,擦除部分TBitmap32(图层)

是否可以编辑图层的图像?我的意思是,有一个带有多个可选图层的 TImgView,我想知道是否可以选择一个图层(橡皮筋和所有图层),例如单击菜单中的一个按钮,鼠标会变成橡皮橡皮擦,可以在单击时删除鼠标下的内容。就像 Paint.net 或 Photoshop 中的橡皮擦一样。

有可能实现这一目标吗?如果是这样,那怎么办?到目前为止,我找不到这样做的方法。在常规 TImage (TPaintBox) 中,解决方案是在背景顶部绘制白色,但这不是处理透明图层/图像时的解决方案。那么该怎么办?

任何帮助(代码)将不胜感激。

谢谢

0 投票
2 回答
2765 浏览

delphi - Delphi Graphics32如何在图层上用鼠标画线

谁能帮我将这种动态绘制线条的好方法(使用delphi的Photoshop风格绘图线)转换为Graphics32?

我的意思是,我想要一个 ImgView,向它添加一个新图层,然后在图层而不是表单的画布上执行这些方法。

所以我假设,我的代码应该是这样的:

...

我假设这段代码是因为这些是来自链接的常规画布绘图方法中使用的事件,但其余方法不像它们应该那样工作

所以它不起作用。什么都没发生。任何人都可以帮助我像在正常的画布绘图中一样进行这项工作吗?我想只为一层实现这一点,我用 Button1Click 创建的层...(ImgView 是放置在表单上的 ImgView32 控件,表单上还有一个按钮)

结果看起来像这样(错误说Canvas不允许绘图) 在此处输入图像描述 第一次出现错误onButtonClick,然后在I Ok it之后,我开始绘图,它不会擦除移动线(就像上图一样),然后onMouseUp 再次出现 Canvas 错误。

我究竟做错了什么?

如果我使用 SwapBuffers32,则不会绘制任何内容,并且画布错误会不断出现。

编辑:我做了一些改变只是为了尝试在汤姆布伦伯格的建议之后让它工作,我最终得到了这个代码:

现在,不再出现 Canvas 错误,但鼠标移动线保持绘制...解决方案必须在 BitBlt 函数 (swapbuffers32) 中。有任何想法吗?

0 投票
1 回答
2723 浏览

delphi - Delphi Graphics32透明图层画线

我正在尝试向 ImgView32 添加一个图层,并在该图层上画一条线。但是,我希望该层是透明的,所以它不会覆盖之前添加的所有层。所以我想获得:

这是以下问题:Delphi Graphics32 如何用鼠标在图层上画线 您将找到我用于画线并在链接后声明 BitmapLayer 的代码。我不想在这里添加它,所以问题仍然很小。

顺便说一句,我已经尝试为绘图层声明这个:

这也是

(BL -> TBitmapLayer) 没有变化。当我创建 BitmapLayer 时,它就像一张白纸一样位于先前图层的顶部,将它们隐藏起来。问题是:这可以做到吗(使图层透明)?那怎么办?

谢谢

0 投票
2 回答
1491 浏览

delphi - Delphi Graphics32 relative mouse position (to the layer)

I have a ImgView32, that is anchored to all form margins. The form is maximized.

The bitmap of ImgView is not fixed (it can be of different sizes)

I am trying to draw a line on a transparent layer using ther code from this question:Drawing lines on layer

Now the problem is that, using that exact code, I can only draw in the top-left corner, like in this image: drawing after resizing the form (maximize)

As you can observe, the lines can be drawn only in the left top corner. If I try to add some value to the Start and End Points, the whole thing goes crazy. So I must find a way to translate the points in such a fashion that, the user will be able to draw only inside of the center rect (visible in the image)

I am out of ideas.

Please help

Here is the whole unit:

What am I doing wrong? Please test the unit above to see what I mean. Remember to add a ImgView and anchor it to all margins, then at runtime, maximize the form and try to draw the lines...

EDIT

In the green image above, there is a rect, more like a square in the middle of it (not very visible) but you can see it if you look closely.

Since my problem might be misunderstood, please take a look at the following image image

I need to be able to draw ONLY in the white rectangle (Bitmap) in the middle of the ImgView. I do not know how to explain better.

It is not a solution for me to make the rectangle/Bitmap fit exactly the ImgView, because that is not the point of my project.

Take a look at Paint.net and imagine that my project kind of does the same (except it's not that complex). But the principle is the same: you decide the size of your document/image when you start a new project, then you add different images as layers, you scale and rotate them, and now I want to allow the users to draw lines inside of a special layer (the drawing layer) But everything happens inside the boundaries of that document size. Like for example in the above image, the size of the document there is A5 (100dpi) scaled at 83%.

So my problem is that I cannot allow the users to draw the lines outside the white rectangle (middle of the screen). So their lines can start in those boundaries and end there.

I know my test unit is not perfectly clean. I pasted some functions used in the main project and quickly removed some parts from them that are not relevant to this example. The AddTransparentPng procedure is there only to allow the testing of adding a transparent image to the ImgView so I can test if the drawing layer is not covering another possible latyer.

(The Scaled property belongs to the layer (B) it's under the 'with B' statement. I removed the With 'ImgView.Bitmap... Location' statement so it would not bother you anymore :) )

Anyway, please do not pay attention to the code that does not affect the drawing of lines. That code is what needs attention.

EDIT If I set the layer's scaled to true (Scaled:=true) then it messes everything up, like in the image bellow: enter image description here

I still have to use offsets but a little differently

Thank you

0 投票
2 回答
2673 浏览

delphi - Delphi Graphics32在图层上绘制透明椭圆

我希望能够在 ImgView32 的透明层上绘制一个空的椭圆。知道怎么做吗?到目前为止,我能想到的只有:

起点和终点在鼠标事件中获得。

我实际上正在尝试绘制一个动态椭圆(在鼠标事件上)。所以涉及到onMouseDown(LayerMouseDown)、onMouseUp(LayerMouseUp)和OnMouseMove(LayerMouseMove)事件。作为参考,请检查这个问题,它处理动态绘制一条线。我想做同样的事情,但用椭圆而不是线条。

所以我有 AddCircleToLayer 过程而不是 AddLineToLayer 事件现在看起来像这样:

但是当我使用这段代码时,圆圈(椭圆)被白色填充(就像在这张图片中一样) 在此处输入图像描述 ,直到我开始绘制下一个椭圆(所以 onMouseMove 和 onMouseUp 椭圆被填充)。只有当我再做一次 onMouseDown 时,前一个圆圈才会被清空,但新的椭圆也被白色填充(就像这张图片一样) 在此处输入图像描述

此外,如果您尝试一个接一个地做更多的椭圆,并且在旧的顶部,您会注意到会有 onMouseMove 椭圆的痕迹,如下图所示:

在此处输入图像描述

所以这段代码一定有我遗漏的东西。

请帮我解决这个问题。

0 投票
1 回答
1471 浏览

delphi - Delphi Graphics32 将普通图层与绘图图层相结合

绘制图层是指用户可以手动绘制线条、圆形或其他形状的图层。普通层是指 graphics32 层示例中描述的层(可以在运行时使用鼠标事件移动或调整大小的层)所以我很难组合这两种类型的层。在我的测试项目中,现在,我假设我只有一个绘图层和多个 PNG 层。因此,在我的项目中,我在 OnFormCreate 中为 ImgView32 设置了属性,例如:

在此之后,单击一个按钮,我添加了一些图层(包含透明的 PNG 图像)。所以就像这样

(我不会在这里详细说明添加PNG图层以保持问题简短。我只会说它使用与drawingLayer中使用的事件不同的onMouseDown事件(layerMouseDown))并且AddDrawingLayer如下:

EdLayerIndex 是一个编辑框,我在其中显示创建/选择的图层索引(用于调试)

  • 正如您在上面看到的,如果我保留Selection:=BB然后RBLayer:=nildrawingLayer 只能移动和调整大小,所以这不是一个好的解决方案,因为我想在这个特定图层中使用我的鼠标事件来绘制。
  • 如果我仅RBLayer:=nil在保留的同时进行评论,Selection:=BB则绘图层不再可移动,但我无法选择绘图层的其他图层。我只能访问顶层(最后添加的PNG层)

  • 如果我发表评论,Selection:=BB那么我无法用鼠标选择其他图层。所以在我的例子中,我在drawingLayer之前声明了2个png图层,在它之后声明了一个。在运行时我只能选择最后一层(绘图层“上方”的那个)所以这也不是一个解决方案。

当我单击绘图层(或以其他方式选择它,例如在列表框或其他东西中)时,我该如何做到这一点,drawingLayer 将无法移动,但我的绘图鼠标事件会启动?在这一切期间,我可以随时离开drawingLayer,并选择其他图层来移动和玩耍。所以基本上我需要一个特定的层不要像其他层一样。

我想要实现的是使用 graphics32 具有经典的类似 Photoshop 或 paint.net 的行为。这些层属性如何实际工作非常令人困惑。

到目前为止,我想出了如何在透明层上动态绘制(线、圆、矩形)(使用鼠标事件)。所以我可以有一个绘图层。绘图发生在我的DrLayerMouseDown, DrLayerMouseUp, DrLayerMouseMove,DrLayerPaint事件中。但我似乎无法理解如何将这样的绘图层与常规的可移动/可调整大小的层结合起来。

其余代码(如setSelection和)大部分取自 graphics32 库的图层示例RBResizinglayerMouseDown

编辑

为了测试你的想法layerOptions,我做了以下事情:

1.开始一个新的测试项目,上面有一个ImgView,还有一个按钮

2.在创建时我使用了和以前一样的代码

3.OnButtonClick 我使用修改后的 AddDrawingLayer 添加了一个图层,如下所示:

期望它对鼠标事件不敏感。但是该层仍然是可移动的,而不是对鼠标不敏感。所以就像我什么都没做

所以我不认为它对我使用这个选项有帮助,除非我做错了所以在图层的 onCreate 上,这个选项似乎没有坚持。但是如果我禁用所有图层的鼠标事件,就像在下一个编辑中一样,那么绘图层就会被禁用(鼠标事件)

编辑

我还尝试了另一个测试项目,同样的想法:相同的 onCreate 和 onButtonClick 我添加了 3 个图层(使用库的图层示例),每个图层都包含一个图像(这次没有绘图层,以保持简单)。然后我添加了一个新按钮,如果单击它,将执行下一个代码:

我的目的是使所有图层对鼠标事件不敏感。我成功了,单击新按钮后,无法再选择图层,但是当我想为图层重新启用鼠标事件时(使用下一个代码 onClick 添加第三个按钮):

没有显示错误,但是当我尝试选择一个图层以移动它时……所有图层的图像都从视图中消失了……给我留下了一个空白背景的空白 ImgView。

我究竟做错了什么?为了执行您对 LayerOptions 的建议,我需要能够禁用所有图层的鼠标事件,并为特定图层启用鼠标事件,然后在完成编辑后,我需要能够重新启用鼠标事件对于所有图层,但我猜我做错了。

0 投票
2 回答
815 浏览

delphi - Delphi:GR32 混合 Alpha 通道取决于 Clear() 颜色

我使用了带有 alpha 通道的图片,并且某些图像部分不是完全不透明的。当我在一个对象上绘制它时TImgView32,部分会从颜色中获得一点Clear()颜色。让我们通过示例图片来展示它:

这是您通常在 Photoshop 中看到的原始图片:

在此处输入图像描述

这是我在 GR32 对象的新图层上绘制它时的结果图像,我之前用以下方法清除了它Clear($00FF0000);

在此处输入图像描述

结果像 photohop 一样透明,但红色光晕是问题所在。

或另一种颜色Clear($000000FF);

在此处输入图像描述

请注意,如您所知,我使用的颜色是完全透明的。

这是我用来创建上述结果的代码:

如何避免这种情况并获得像 Photoshop 一样的清晰结果?

0 投票
2 回答
769 浏览

delphi - 如何使用像乘法这样的混合模式来填充矩形,而不仅仅是简单的透明度

我正在使用 Delphi 库 Graphics32 在屏幕上绘制音频图形,然后在音频中表示一系列句点。

该图非常简单:黑色背景,音频波形填充浅灰色。

现在的句点是使用FillRectTS半透明颜色绘制的矩形。我正在寻找一种方法(希望是一种简单的方法)使用像 Multiply 这样的混合模式来绘制它,所以音频波形是获得颜色的那个,而背景仍然是黑色。我在TBitmap32类中没有找到任何允许我这样做的函数(例如,g32_Interface 单元)。

这需要在绘制音频波形之后完成,因为按需重绘这个非常耗时,并且周期是用户在运行时定义的,因此无法直接使用颜色绘制音频波形。

这是一个小例子,说明它是怎样的,我希望它如何:

示例图形

现在绘制句点的代码(我需要更改的方面)如下:

ColorDibujadoget是根据不同条件(是否选择事件,以及事件类型)所需的透明度,但最后的想法是相同的。这段代码的绘制类似于上图的第一部分。

Delphi 或 C++Builder 中的解决方案(或想法)对我来说很好。

更新

我已经直接在 Graphics32 代码上实现了这个,使用它已经提供的任何颜色混合例程,它解决了我的需求。它是一组额外的 FillRect 函数,它采用另一个参数供混合模式使用。如果它还活着,我会尝试将它纳入官方项目......

0 投票
1 回答
569 浏览

delphi - 将 ImgView32 透明图层保存为 PNG

我在将 ImgView32 图层保存为透明 PNG 时遇到问题。我使用此问题中的代码进行保存。但是,图像以白色背景保存。

下面是我如何初始化 ImgView32,在其上创建一个图层,然后在其上画一条线:

所以 iv1 是我的 ImgView32 的名称。然后我用这段代码在上面画一条线:

如果我在绘制矩形时对上述代码使用clWhite32,那么在保存PNG时,imgView的背景会变黑......所以我真的不明白这个问题。

我这样保存:

和实际的保存代码(来自上述链接)

我不明白为什么它不将图层保存为透明 PNG。我该如何解决?欢迎任何想法。

您可以使用上面的代码复制我的问题。它使用 GR32_PNG 和 GR32_PortableNetworkGraphic。您只需要在表单中添加一个 TImgView32 控件并添加上面列出的代码即可。

0 投票
2 回答
1107 浏览

delphi - 在 ImgView32 图层上绘制粗虚线

我只想在 ImgView32 的图层上画一条垂直虚线粗线。我还希望我的线更粗,所以我画多条线彼此靠近,因为 Canvas.Pen.Width 对 LineTo 方法没有影响。所以我的代码如下:

所以这条线打算放在新层的中间。我使用这个添加图层:

对于其余的代码,只需将我的代码添加到图层示例中,您就可以重现我的问题。

据我所知,为了绘制虚线,有多种方法,例如带有 LineToFSP 的 Stipple(在我的代码中使用)或带有 BuildDashedLine 点的 PolyPolygonFS。但我似乎无法让它们中的任何一个正常工作。实际上第二种方法没有做任何事情......所以我坚持我的第一种方法。因此,似乎每次开始画线时,虚线开始的方式都是随机的。所以它要么是一个像素,要么是一个空像素。因此,当我调整图层大小时,线条的变换如下图所示:

在调整大小之前 第一次调整大小后 更多调整大小后 更多调整大小后

事实上,我想要实现的是:

期望的结果

当然,我希望在调整图层大小时再次绘制线条而不扭曲它(这就是我使用 onPaint 处理程序方法的原因)。如果我只是在图层上画一条简单的线(使用 Bitmap.Canvas)然后调整图层的大小,那么线条会像拉伸 jpeg 一样扭曲,所以我想避免这种情况。

所以请告诉我如何在 ImgView32 (TGraphics32) 的图层上绘制粗虚线

编辑

在尝试了答案中的代码后,我让它工作了。然而,这个层有一个副作用:当调整层的大小(使用鼠标)时,在某些宽度上,虚线的颜色会变暗和模糊,如下所示:

调整大小之前 调整大小 在此处输入图像描述 之后(有时)。 在此处输入图像描述

您可以使用相同的代码自己重现此内容。

编辑

这个特殊层还有另一个问题:将其保存到文件中...我尝试使用 2 种方法将其保存为透明 PNG,但我不断收到损坏的文件。即使我尝试将图层保存为位图,也会发生相同的损坏。也请检查这个问题:

Graphics32 - 将透明绘图层保存为 png