问题标签 [timage]

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 投票
1 回答
1319 浏览

delphi - Delphi 6:子图像和主画布之间的 Alphablending 工作,但不在子图像之间

我有一个 Delphi 6 应用程序,其中我有一个 TBitmaps 数组,每个包含一个图像(子图像),该图像是通过使用 clWhite 调用 FillRect() 以用白色填充 TBitmap 的 Canvas 来创建的,然后调用 toTextOut()将一些文本打印到位图的画布上。

我有一个计时器,它更新属于 TImage 组件的主 Canvas,每个 Interval 都使用数组的内容来反映每个子图像 X、Y 坐标因为它们在运动中所做的更改。首先,我使用带有 clWhite 的 FillRect() 来用白色填充主 Canvas。要“打印”子图像,我只需迭代数组并调用 Alphablend() 将每个子图像“打印”到主画布上。每个子图像都有一个 Z 坐标,用于控制不透明度的级别。Z 坐标较高的子图像具有较低的 Alphablend() 值,以使它们看起来比“近距离”的子图像更透明。

alpha 混合对每个单独的子图像都非常有效,具有较高坐标的子图像确实看起来比具有较低 Z 坐标的子图像更透明。但是,我遇到了在 Z 空间中重叠的子图像的问题。重叠子图像之间的 Alpha 混合似乎不起作用。相反,重叠子图像“后面”的子图像被属于覆盖它的图像的白色背景遮挡。我想要的是两个子图像正确重叠,所以看起来两个文本字符串写在彼此之上。相反,我看到前面的文本字符串和包含它的 TBitmap 画布的白色背景无处不在,消除了它“后面”的文本字符串。

谁能告诉我为什么 alpha 混合在每个单独的子图像和主 Canvas 之间起作用,而不是在子图像之间起作用?我只在时间上下文中说子图像之间而不是作为对象,因为它们在打印时都应该成为主画布的一部分,我希望 alpha-blend 能够正确地混合它们,这不会发生。

就好像子图像之间的“白色”没有被视为与子图像和属于主画布的“白色”之间的“白色”一样。

跟进:针对 Andreas 的评论,我将所有子图像 TBitmap 的 PixelFormat 设置为 pf32bit。现在 alpha 混合发生在子图像“之间”。不幸的是,子图像的白色区域没有被视为透明颜色。相反,顶部子图像的白色背景与属于底层子图像的文本进行 alpha 混合,在顶部子图像周围创建一个浅灰色框架,就好像它被涂抹一样。为了获得我想要的效果,我需要完全忽略子图像的白色背景。

0 投票
1 回答
2557 浏览

delphi - Delphi 6:TImage Width 和 Height 属性报告错误值?

我对 TImage 组件的宽度和高度属性有一个相当奇怪的问题。作为测试,我通过获取 TImage 宽度和高度的中点并在此处绘制点以使其居中(centerPoint2D 是 TPoint)在 TImage 组件的中心(应该是)绘制一个红点:

红点没有出现在 TImage 的中心,而是出现在其下方和右侧的某个位置。此外,我打印到组件的任何文本都会出现拉伸。就好像 TImage 比报告的尺寸大得多,比从明显视口可见的要大,就好像可见的东西被剪裁了一样。

额外细节。TImage 控件位于 TPanel 上,该 TPanel 位于 TFrame 上的 TGroupBox 上。但是,所有这些组件的 Align 属性都设置为 alClient。TFrame 本身的 Align 属性设置为 alNone。但是,位于 Form 上的实例在设计时将其 Align 属性设置为 alClient。换句话说,它不应该是 TImage 组件大于它在运行时可见的部分的情况。此外,报告的尺寸确实与我眼中显示在屏幕上的组件大小相匹配,但我没有“像素标尺”实用程序来客观地确认这一点。

0 投票
1 回答
885 浏览

delphi - 在 Timage 组件中分块加载大图

我在服务器上有一个大图像。当用户请求任何一个时,我将它们下载到客户端计算机上,一旦完成,我将其加载到 Timage 控件中。

现在,客户端要求图像必须以块(部分)的形式出现,并且一旦下载了块,就必须在 Timage 控件中显示它,并且一旦下载了其他块,就必须将其附加到先前加载的图像中。

我不知道如何进行相同的操作。我正在使用德尔福 2006

0 投票
1 回答
4090 浏览

delphi - 如何加载一个小的系统图标?

我需要为错误/警告/信息显示 16x16 像素图标。不幸的是LoadIcon(0, IDI_*)LoadImage(0, OIC_*, IMAGE_ICON, 16, 16, LR_SHARED)总是给我 32x32 版本的图标。

我读到过,ShGetStockIconInfo但这只能从 Vista 开始,我仍然需要支持 XP。

有任何想法吗?

如果这很重要,我正在使用带有TImage组件的 Delphi 2010。

0 投票
1 回答
2766 浏览

delphi - delphi 7 TImage 和 TImageList

让我成为整数私有

编码

如何从列表中拉伸图标以适应 Image1 的大小?

0 投票
2 回答
1275 浏览

delphi - 将 AlphaBlendValue 属性添加到 Delphi 的 TImage 的最简单方法是什么

如果有可疑的参数值,我会在对话框中显示“警告”图像。用户并不总是注意到它,所以我想在一秒钟左右的时间内循环淡入和淡出它(是的,我可以切换 Visible 属性,但这看起来有点像我只是切换 Visible 属性)。有没有比将它放在自己的表单上并将其浮动在对话框上(并更改表单的 AlphaBlendValue 属性)更简单的方法?

0 投票
1 回答
1247 浏览

delphi - 为什么这个 D2006 代码不能淡化 PNG 图像?

这个问题源于一个较早的问题。大多数代码来自建议的答案,这些答案可能在更高版本的 Delphi 中有效。在 D2006 中,我没有得到全范围的不透明度,图像的透明部分显示为白色。

图片来自http://upload.wikimedia.org/wikipedia/commons/6/61/Icon_attention_s.png
它在运行时从 PNGImageCollection 加载到 TImage 中,因为我发现您必须这样做,因为在保存 DFM 后图像不会保持完整。为了演示该行为,您可能不需要 PNGImageCollection,只需在设计时将 PNG 图像加载到 TImage 中,然后从 IDE 运行它。

表单上有四个按钮 - 每个按钮设置不同的不透明度值。Opacity=0 工作正常(paintbox 图像不可见, opacity=16 看起来不错,除了白色背景, opacity=64, 255 类似 - 不透明度似乎在 10% 左右饱和。

关于发生了什么的任何想法?

** 这段代码(使用 graphics32 TImage32)几乎可以工作 **

**(更新)此代码(使用 graphics32 TImage32)确实有效 **

以下代码在运行时成功地将 PNG 图像分配给 Graphics32.TImage32。带有 alpha 通道的 PNG 图像在设计时被加载到 TPNGImageCollection(非常有用的组件,因为它允许混合任意大小的图像)。在创建表单时,它被写入流,然后使用LoadPNGintoBitmap32从流中读取到 Image32 中。完成此操作后,我可以通过分配给 TImage32.Bitmap.MasterAlpha 来控制不透明度。不用担心 OnPaint 处理程序。

0 投票
2 回答
5743 浏览

delphi - 上面的控件,像TPanel可以做什么?

我的程序正在执行一项耗时的任务,我想在应用程序窗口的中间显示一个 TImage,但它不会保持在顶部 - 我的 VST 总是在顶部。但是,当我使用 TPanel 时,它会保持在顶部吗?我怎样才能让我的 TImage 做到这一点?

事实上,适用于所有控件的解决方案将非常棒:)

谢谢!

0 投票
1 回答
3453 浏览

delphi - Delphi 2006:PNG 到 TImage 的运行时分配失去了 alpha 透明度

Delphi 2006 的 TImage 不太支持 PNG。为了在我的表单上显示具有 alpha 透明度的图像,我必须在运行时加载它们。我可以在设计时加载它们,但它们无法生存,我认为是因为 PNG 没有保存在 DFM 文件中。我确信这在最新的 Delphi 中都是笨拙的,但我目前无法升级。

无论如何,我在运行时加载它们:

PNGImageCollection 组件包含我所有的各种大小的 PNG(这些是在设计时创建和加载的),我将它们分配给 FormCreate 事件中的相应 TImage。

这工作正常,直到我遇到问题,在表格上使用这些图像后,我试图在其他地方重用这些图像。我发现分配 TPicture 的行为已将其设置为空图像作为分配的结果。这发生在例程 TPicture.ForceType 中,AFAICT 检查 FGraphic 的类型,如果它不是所需的类型,它会释放 FGraphic 并创建所请求类型的新实例。

好的。因此,经过一番摸索,我发现也许我真的应该这样做:

这起到了作用,因为分配没有破坏图像,但图像现在显示为不透明的半透明位,即:

使用 Image1.Picture.Bitmap.Assign 分配时的 TImage

代替:

使用 Image1.Picture.Assign 分配时的 TImage

如何让此图像正确显示 alpha 透明位?(和补充问题:Image1.Picture.Bitmap.Assign 是正确的方法吗?)。

这是更详细的代码:

在我遇到“重用”TImage 问题的代码中,顺序是:
在表单创建上:

(PNGIMage 是公司标志,LogoImage1 在主窗体上)。

在打印报告标题上:

第一次调用打印徽标的例程时,它会正常执行,但在调用 PrintBitmapRect 后,LogoImage .Picture 会被清除。下次调用打印头例程时,对 CalcGraphicHeight 的调用将失败,因为图像的宽度和高度为零。

将 Picture.Assign 更改为 Picture.Bitmap.Assign 修复了标题打印例程中的 RTE,但是当我将相同的“修复”移植到从 PNG 分配的其他静态图像(如上面的齿轮)时,我失去了 aplha 通道。

0 投票
4 回答
15729 浏览

delphi - 如何将 BLOB 流中的任意图像加载到 TImage 中?

如果我理解正确,TImage.LoadFromFile从文件扩展名确定图片的类型。

有什么方法可以从TBlobStream包含原始图像的图像中自动检测图像类型?

我当前的代码: