【发布时间】:2018-02-23 08:49:09
【问题描述】:
我正在实现自定义面板模糊效果。我想模拟玻璃效果。 我在搜索中找到了the following code:
function blur(source:TBitmap):TBitmap;
var
x, y, x3:integer;
tline, mline, bline:PByteArray;
begin
for y := 1 to source.Height - 2 do
begin
tline := source.ScanLine[y-1];
mline := source.ScanLine[y];
bline := source.ScanLine[y+1];
for x := 1 to source.Width - 2 do
begin
x3 := x*3;
mline^[x3] :=
(mline^[x3 - 3] + mline^[x3 + 3] +
tline^[x3 - 3] + tline^[x3 + 3] + tline^[x3] +
mline^[x3 - 3] + mline^[x3 + 3] + mline^[x3]) div 8;
mline^[x3 + 1] :=
(mline^[x3 - 2] + mline^[x*3 + 4] +
tline^[x3 - 2] + tline^[x*3 + 4] + tline^[x3+1] +
mline^[x3 - 2] + mline^[x*3 + 4] + mline^[x3+1]) div 8;
mline^[x3 + 2] :=
(mline^[x3 - 1] + mline^[x3 + 5] +
tline^[x3 - 1] + tline^[x3 + 5] + tline^[x3+2] +
mline^[x3 - 1] + mline^[x3 + 5] + mline^[x3+2]) div 8;
end;
end;
result := source;
end;
上面的函数可以正常工作,但由于我不是作者,对图像处理一无所知,我会在这个函数中添加设置模糊级别的可能性。
我还找到了following code,它可以工作并且可以配置,但是应用起来很慢。
我发现“配置”模糊的临时解决方案是根据您想要的模糊程度调整函数以递归方式运行。见下面的代码sn-p:
function blur(source:TBitmap; nTimes: Integer = 1): TBitmap;
var
x, y, x3, I : integer;
tline, mline, bline: PByteArray;
begin
if nTimes = 0 then Exit(source);
for I := 0 to nTimes do...
问题是:如何制作可配置且高效的模糊效果或者谁能帮我改进上述功能?
【问题讨论】:
-
这很有趣,但如果您错过了重点,这是一个问答网站。你知道什么代表一个问题,不是吗?
-
@TomBrunberg 一千个道歉。我太兴奋了,我忘记了主要的。我非常重视这个网站,我尽一切努力满足一个好问题的要求。我已经编辑了这个问题,如果可能的话,希望你能帮助我。
-
当然有很多关于这个主题的文章。你一定做过一些研究。
-
您面前有代码。你不明白它在做什么?使其可调整是相当微不足道的。这不是一个问题,这是一个工作请求——你要求的是可交付成果。这不是这里的工作方式。
-
@AnselmoMS 您上面的代码实现了box blur 的类型。您可以在这个问题中阅读模糊算法:How is Gaussian Blur Implemented?
标签: image delphi blur effect graphic