精华内容
下载资源
问答
  • 这个包可以为您选择任何颜色选择器,并将其包装渐变选择器。 这与包角度选择器配合得很好,它允许您的用户使用渐变角度。 安装前需要了解什么? 这个包使用钩子,这意味着你需要使用 React 16.8 或更高版本。 ...
  •  如果你仅仅是想实现图像到图像的渐变,我可以给你示范如何用 GDI+ 函数 AlphaBlend 来实现,微软的老大们在 MFC 中已经对之进行了足够友好的包装,CDC::AlphaBlend。AlphaBlend 中的 alpha 是一个图形学术语。它...

    有没有方法创建一个半透明的窗口,并将该窗口上发生的所有鼠标事件都传递到桌面或另一个应用窗口处理?

    Scott Stringham

    answer.gif 当然可以,并且相当容易。你只要创建一个“分层窗口”即可。我写了一个小程序叫 lwtest 来示范如何做。你可以下载源代码。为了创建分层窗口,你需要扩展式样 WS_EX_LAYERED,此外,为了能在透明窗口上进行鼠标点击,你还需要 WS_EX_TRANSPARENT 扩展式样。在窗口创建之后,你可以同时设置两个式样,MFC 代码如下:int CMainFrame::OnCreate(...)

    {

    ...

    ModifyStyleEx(0, WS_EX_LAYERED|WS_EX_TRANSPARENT);

    }

    ModifyStyle 和 ModifyStyleEx 是专用的 MFC CWnd 方法,其作用顾名思义。如果你用 C 语言编写,那么得调用 GetWindowLong(GWL_EXSTYLE) 来获取扩展式样,然后必须调用  SetWindowLong(GWL_EXSTYLE)来设置式样。其效果与 ModifyStyle(Ex)一样。当然,你也可以在创建窗口的时候使用此式样。  一旦创建了分层窗0口,你便可以调用 SetLayeredWindowAttributes 来设置透明度。可用的分层窗口属性之一是 LWA_ALPHA,它就是用来调整透明度的,取值范围从 0(完全透明)到 255(不透明)。要得到半透明的效果,可以这样调用 SetLayeredWindowAttributes:// in CMainFrame::OnCreate

    SetLayeredWindowAttributes(0, 255 * 0.50, LWA_ALPHA);

    这里我用乘法来表示一般公式;你可以仅用 128,因为那是 255 的一半(四舍五入)。你还可以用专门的颜色作为透明色。此时,你得用 LWA_COLORKEY 作为属性,在第一个参数中指定 COLORREF。Windows 会让所有像素颜色都呈透明。注意前面的代码段假设你是从 CWnd 派生对象中调用。如果用 C 语言,你得使用 ::SetLayeredWindowAttributes,它带有一个额外的参数 HWND。  你可以用分层窗口来进行动画和其它转换效果的处理;详细细节请参考文档中的“分层窗口”部分。

    question.gif 我正在写一个幻灯显示程序,该程序要显示JPEG图像序列。我使用了 2002年三月刊专栏文章中的 CPicture 类来绘制图像(参见:)。那个程序运行得很好。但我现在想添加从某一张图像到下一张图像的渐变特性。我在网页中用转换效果可以做到。那么是否有办法从程序代码中实现图像渐变特性?

    Bob Kline

    answer.gif 借助 COM 确实可以在 IE 中实现转换效果。这些效果包括——渐变、擦除,框入、框出、棒状等等——在DirectX 中都支持。具体细节已经超出了本文的讨论范围,所以我只能让你去看相关文档,其内容参见“Internet Development SDK”中的“Using Transforms in C++”。你需要熟悉 COM 以及一些基本的 DirectX 知识,如:表层(surfaces)和转换(transforms)(DXSurface 和 DXTransform)。  如果你仅仅是想实现图像到图像的渐变,我可以给你示范如何用 GDI+ 函数 AlphaBlend 来实现,微软的老大们在 MFC 中已经对之进行了足够友好的包装,CDC::AlphaBlend。AlphaBlend 中的 alpha 是一个图形学术语。它表示位图使用3个字节来说明一个像素:每个字节分别表示 红、绿、蓝的值。由于 32位的 DWORD 有4个字节,多余的这个字节常被用作“alpha channel”,用于指定像素的透明度。这个 alpha 值按照如下的公式来合并像素:[R,G,B]blended = ?[R,G,B]image + (1-?? [R,G,B]background

    当 alpha 为 0 时,你得到的是背景(图像完全透明);当 alpha 为 1 时,你得到非透明图像(完全不透明)。实际有透明效果的 alpha 值是一个 8 位的字节表示的值,范围从0-255,0 和 1 只是表示透明和非透明两个极端。它们都是可用的 alpha 值,但大多数应用程序不需要;多数应用程序使用一个常量 alpha 值来处理整个对象,如一幅图像。例如,你可能想让一幅特定的图像以25%的透明度显示。  AlphaBlend 函数类似老的 BitBlt 和 StretchBlt,但它仅仅实现渐变。发音为“blit”,这个术语是从古老的 PDP-10 BLT (块转移)指令派生而来,这个指令用于将大块内存从一个位置转移到另一个位置。AlphaBlend 的细节如 Figure 1 所示,参数简单明了,但是用 AlphaBlend 来实现渐变很繁琐,因为只调用一次是不行的,必须重复调用来产生渐变效果,用一个定时器和 0-255 之间不同的 alpha 值来控制。  为了展示 AlphaBlend 实际的工作过程,我编写了一个程序 BlendView,该程序基于我的一个图像查看程序,参见 2002 年 3 月刊的。BlendView 可以查看各种图像文件(BMP、JPG、GIF 以及其它任何 GDI+ 支持的格式),但是当你打开一幅新图像时,原来的图像会渐变成新图像,如 Figure 2 所示。

    0512CAtWorkColumnimg02a.gifFigure 2 原图像

    0512CAtWorkColumnimg02b.gifFigure 2 渐变的图像

    0512CAtWorkColumnimg02c.gifFigure 2 最终的图像  为了将一幅图像渐变为另一幅,你需要两幅图像,当用户打开一个新文档时,MFC 要做的第一件事情是销毁旧的那个对象。所以你考虑在 MFC 加载新图像前将旧图像保存在某个地方。因为渐变效果概念上属于视图处理(绘制图像范畴),所以我把处理过程放在在视图(View)中。也就是说在视图中保存旧图像。但视图如何知道何时要保存图像呢?你当然得告诉它。幸运的是,CDocument 具备一个方法,你可以用它来随时通知视图发生了什么。这个方法就是 CDocument::UpdateAllViews:// in Doc.cpp:

    BOOL CPictureDoc::OnOpenDocument(LPCTSTR lpszPathName)

    {

    UpdateAllViews(NULL, PREOPENDOC, this);

    return m_pict.Load(lpszPathName);

    }

    PREOPENDOC 是我自己的枚举代码,在 doc.h 中定义。当你调用 UpdateAllViews 时,将自己的“提示代码”(一个32位整数)随一个指针传递到“提示对象”,该对象可以是任何 CObject 派生的 MFC 类。这里我传的是文档本身。注意我是在加载新图像之前调用 UpdateAllViews,而旧图像仍然有效。视图处理通知消息保存该图像:void CPictureView::OnUpdate(CView* pSender,

    LPARAM lHint, CObject* pHint)

    {

    if (lHint==CPictureDoc::PREOPENDOC) {

    SaveDocImage((CPictureDoc*)pHint);

    }

    }

    相同的 OnUpdate 函数处理所有文档的通知消息,所以你得检查发送了哪个通知消息。一般情况下,提示代码和提示对象背后的工作原理是文档以提示方式提供信息,告诉视图它需要更新屏幕的哪一部份。对于 CPictureView 来说,如果提示代码是 PREOPENDOC,那么 CPictureView则调用一个辅助函数 SaveDocImage 来保存当前图像。Figure 3 是 SaveDocImage 的代码,它创建一个位图和内存设备上下文(DC),然后在内存设备上下文中呈现图像,在文档摧毁原来图像后有效地进行渐变拷贝。  现在,当用户打开一个新文件,文档通知视图以及 OnUpdate 处理例程以位图形式保存图像。渐变是怎么做出来的呢?它需要重复调用 AlphaBlend 从老图像渐变成新图像。最显而易见的方法是设置一个定时器。假设你想用三秒来渐变。为了用 100 步来实现渐变,你可以将定时期设置成 3000/100=30毫秒。但问题是 AlphaBlend实际上花了大量的时间来处理渐变。而且,所花的时间依赖于图像的大小。较大的图像渐变的时间较长。如果你使用定时器来做,最后得到的幻灯效果是较小的图像更快,较大的图像更慢——可能不是你想要的结果。  保持渐变时间为常量的方法是固定持续时间——假设为 3,000 毫秒——然后根据实际逝去的时间计算 alpha 值,假设第一次迭代发生在 t+20 毫秒。那么你可以用的 alpha 值为 20*255/3000 = 1 (取最近似的一个整数)。然后根据当前时间计算的 alpha 值立即进行另一次渐变。如果逝去的时间超过一半,你最终的 alpha 值是 .5。通过用实际逝去的时间计算 alpha 值,你可以保证渐变总是按时完成,但缺点是较大的图像无法平滑地完成渐变,因为它们的迭代过程更少,在 AlphaBlend 中花的时间更多。  所有这些实现难易程度不一。Figure 3 和 Figure 4 是详细代码。当 CPictureView::OnUpdate 获得 PREOPENDOC 通知时,保存旧图像之后,它将数据成员 m_iStartTime  置为当前时钟时间。时钟时间是自该进程启动后的“时钟嘀嗒”数。每秒嘀嗒数为 CLOCKS_PER_SEC(通常为 1,000)。当 OnUpdate 返回时,控制传回到文档和 MFC,它调用视图的 OnInitialUpdate 函数,该函数调用 OnUpdate,它重画窗口。最后,Windows 向你的视图发送 MW_PAINT 消息,MFC 通过调用视图的虚拟 OnDraw 方法处理该消息。这是 MFC 的基本常识:在某个视图中,绘图在 OnDraw 进行,而不是  OnPaint 中。CPictureView 是这样绘制的:void CPictureView::OnDraw(CDC* pDC)

    {

    CPicture* ppic = // get current picture

    if (m_iStartTime) {

    // do blend

    } else {

    // render as normal

    ppic->Render(pDC,rc);

    }

    }

    我省略了渐变的细节,主要突出 CPictureView 如何用 m_iStartTime 作为标志来确定是否渐变。以下是实现渐变需要的基本步骤。创建一个内存 DC;

    在该内存 DC 中绘制位图;

    计算渐变的 alpha 值;

    在该内存 DC 中 AlphaBlend 位图;

    将结果拷贝到屏幕(BitBlt);

    在画面以外的内存 DC 中进行渐变然后拷贝到屏幕这一步是很重要的;否则用户将会看到一闪而过的中间图像。因为 AlphaBlend 需要设备上下文,而不是 CPicture 对象,首先绘制新图像(所以我调用 CPicture::Render ),然后在其上渐变旧图像要方便一些。所以我用的 alpha 值与先从旧的图像开始显示所用的 alpha 值相反转(1-alpha) ,换句话说,不是先从旧图像开始,然后在上面以越来越多的效果渐变新图像。我是先从新图像开始,然后在上面以越来越少的效果渐变旧图像。很聪明,不是吗?网格效果处理方法一样。以下是计算 AlpahBlend alpha 值的关键代码行:int alpha = ((clock() - m_iStartTime) * 255) / BLEND_DURATION;

    alpha = max(255-alpha,0);

    渐变之后,如果计算的 alpha 值大于 0,那么就需要处理更多的渐变效果。所以 OnDraw 调用 Invalidate(FALSE) 在不擦除背景的情况下而重画窗口。Windows 发送另一个 WM_PAINT 消息——只是要等到当前消息处理完成。这样一来(使 WM_PAINT 为有效消息),没有阻塞。在渐变期间,用户仍然能使用应用程序。你可以在渐变期间改变窗口大小来证明这一点。CPictureView 在新的窗口尺寸下保持渐变。  如果算出的 alpha 值为 0,渐变完成。计时器停止。这时,OnDraw 调用辅助函数 StopBlending,该函数删除旧图像并将 m_iStartTime 设置为 0,暗示 OnDraw 停止渐变。现在当视图需要绘制时,OnDraw 通过调用 CPicture::Render 进行常规绘制,直接呈现新图像,不发生渐变。  如果你使用活动模板库(ATL)CImage 类来保存图像(而不是用 CPicture,这是我很久以前实现的一个类,当时 CImage 还未出现),你可以用 CImage::AlphaBlend,不过用它来进行渐变会产生一些开销。  如果你使用微软的 .NET 框架,你可以用 Graphics.DrawImage 重载方法函数之一来进行 alpha 渐变,该重载有一个 ImageAttributes 对象参数。ImageAttributes 中的一个方法是 SetColorMatrix。颜色矩阵为一个5x5 矩阵,定义红、绿、蓝颜色映射以及 alpha 加第五个 w 通道,对角线上必须是 1,其它地方必须为 0(学过数学的的人都知道,第五通道被用于实现非线性转换)。为了完成半透明渐变,你得用单位矩阵(对角线上为 1,其余都为 0),然后将 alpha 值(ColorMatrix.Matrix33)置为 .5f 并用它绘制图像。顺祝编程愉快!您的提问和评论可发送到 Paul 的信箱:.

    展开全文
  • 使用符号数学工具箱计算梯度的 fmincon 包装。 这是符号数学工具箱优化的应用之一。 由于符号数学工具箱的限制,符号数学工具箱必须支持目标函数和约束函数。
  • 唐玉 项目四 雪人服饰标志绘制 目的如何使用渐变填充 思 考 你看到了什么 形状 颜色 哪些部分可以完成哪些部分不能完成 项目要求及过程 要求文件尺寸为20cm*20cm 过程新建文档并设置大小 基本形状工具和钢笔工具绘制...
  • rgb渐变色代码matlab PatchMatch Stereo Matlab 实现 此代码实现与 Matlab 的直接接口。 我刚刚写了 Matlab 包装器; 大部分繁重的工作都是由 . 所需的包: Linux :我只在 Linux 18.04 上测试过,但其他 linux 版本...
  • LOGO、品牌包装、海报等······栗如~而为什么这样的海报会成为当下流行?1、这样的渐变色搭配起来相对扁平化风格在视觉上,一定程度上刺激了用户,给人以新鲜 感、时尚感!2、这样的颜色搭配,一定会更加吸引你...

    24fc0fb5e8df70df91fb56978e82ab40.png

    一个好的设计,色彩至关重要;

    根据大众的喜好与设计趋势,当下很多设计中都运用渐变色,特别是线上的产品;

    ui界面、Icon、应用启动页,引导页;LOGO、品牌包装、海报等······

    栗如~

    f9cb0f270d4047d9fb9d06ca0ff5d08b.png

    7deffe03eb3afece434cebf387c91840.png

    bd54744a1e6c2bbacd86efc0e298d0bf.png

    而为什么这样的海报会成为当下流行?

    1、这样的渐变色搭配起来相对扁平化风格在视觉上,一定程度上刺激了用户,给人以新鲜

    感、时尚感!

    2、这样的颜色搭配,一定会更加吸引你的注意;

    当渐变色产生时,两者之间的渐变色总会让人衡量一下它属于什么颜色;

    3、多种颜色的搭配,总是会提高趣味性,体现不一样的效果

    虽然是潮流,但是将其注入情感,承载理念依旧可以成为经典案例!!!

    好像啰嗦太多了,举个栗子吧:

    1、找这样一个模特

    98afc73caa3b88a22f709338471c63f5.png

    2、拖进ps,这种干净的背景直接用魔棒工具点击背景删除

    如果背景比较杂,可用钢笔工具描出流畅的轮廓就够了

    5a68f6a7921a5d43f151fa0c6edbfd36.png

    3、在人物图层上面新建图层,给一个渐变

    选好颜色后,按出shift在画布上垂直拖动

    690a0afe6435b2478d96f1d0a126a458.png

    4、在两个图层之间按住Alt 键单机

    建立剪切蒙版,再给一个正片叠底的效果

    大标识 Created with Sketch.

    eeedeae3688061eab7bf3e6bb6e1027f.png

    6f18fa1d92ac7cf20e3aedcd704ef83c.png

    5、用钢笔工具在墨镜上绘制轮廓

    ea0506b790b44587fd2a43ee527b95b9.png

    并给渐变色,用矩形工具绘制小矩形

    选中镜片的图形与矩形,按ctrl+E 合并矢量图形,整体给渐变色

    db1d2a7741ce8785e58c9cbf9c42a1f4.png

    76f697e07f110dcf8298a5523e6a3108.png

    6、然后就是背景喽

    绘制不同颜色的矩形,在人物的上下各新建图层,给不同的渐变色,再添加上文字

    人物也可以调整为单色(调整色相饱和度即可)

    2d452a75378e4dbb5f7c809f8485e333.png

    或者绘制这样的背景(用钢笔工具勾就可以喽)

    79aa4f89c050dfb2f5fdf3ef492dd094.png

    当然,这是 Photoshop 中的渐变, 由于它是位图,所以不能进行不规则色彩编辑,很多颜色也会出现计算误差;

    但是你还有 illustrator 呀!!!! 在AI中,可以用渐变网格来做渐变:

    栗如:

    画一个圆,点击网格工具就会生成网格,并且用直接选择工具就可以编辑锚点的颜色

    49122fbd466faf1c1ef0a379cd484591.png

    b031c65c7b3544c22d264ad0226a4559.png

    这里的每个锚点就是可以编辑的

    744f55a80bdb2a465ea857ba3434c3a8.png

    还可以调整锚点的透明度:

    34825b3a550de6c91b7444c186f2066e.png

    当然,用渐变工具也是可以的,只不过会有些限制:

    来对比一下吧:

    画一个正方形,我用渐变网格工具,修改锚点的颜色,并不规则拖动方形中的锚点:

    1ec3bfc57036969b9f039c721f263775.png

    第二个方形则用渐变工具

    首先将类型修改为径向渐变,调整外围方向的颜色透明度为零,拉一个渐变

    此时在同一个图形中拉另一个渐变就需要在外观中:新建外观,然后在拖渐变轴

    再更改颜色

    b51373fd2f2a4b4cf14d44315ca6bdcd.png

    依次在四个角都拖入渐变

    大致采用这个方式也可以········

    856874801b8aabfc217b7b844a9b5ab7.png

    a8f9b05179b5f05d495aee176d835745.png

    好了,说完了··········最后再分享一下最近正在做的知乎圈子,每日分享好设计,好艺术,好素材,展览,校园,线上线下活动,也欢迎朋友们的关注。

    艺术设计小圈 - 知乎​www.zhihu.com
    c89cd183c198e888971352cb5141d7c7.png
    展开全文
  • 该产品在EP2数字脉冲输出型传感器基础上增加了渐变加载功能,可实现传感器放大因子的自动校准和自动加载,适用于材料处理、包装以及装配设备。 EP2新增的性能简化了系统设置和维护,并通过减少操作失误而降低成本。...
  • 我们公司生产的Webapp基于后端的图像滤镜,渐变和其他效果,也就是说,前端不负责渲染效果,而是将滤镜或渐变的参数发送到后端, 端,后端生成相应的效果图。效果图发送到前端,前端将效果图显示给用户。 通过所描述...

    这是我很久以前所做的。 今天翻阅上一个演示时,突然发现了它。 我认为还不错。 分享它,每个人都将学习。

    标题首先使这个演示的背景

    我们公司生产的Webapp基于后端的图像滤镜,渐变和其他效果,也就是说,前端不负责渲染效果,而是将滤镜或渐变的参数发送到后端, 端,后端生成相应的效果图。效果图发送到前端,前端将效果图显示给用户。 通过所描述的过程,可以知道从前端到后端,然后从后端到前端,这将花费大量时间,并且此处理将对后端服务器造成很大压力。 要解决此问题,前端只能实现滤镜和渐变效果,但前提是前端和后端渲染效果必须保持一致。

    问题是这样的。 由于问题已得到解决,因此请首先考虑编写演示以首先查看效果。 由于我们的项目基于webpack react redux,并且渲染选择了konvajs,这是一个基于Canvas开发的2d js框架库,您可以单击此处进入其官方网站。 然后,我们的演示也应该基于konvajs,以便以后移植到我们的应用程序中。 在检查konvajs API之后,我们发现它对过滤器的支持已经相当完善,但对渐变的支持仍然很弱。 不支持某些基本渐变,例如线性渐变和径向渐变。 由既然不支持我们只能考虑自己实现了,怎么实现呢?这确实难倒了我这个前端汪,在漫查资料无果的情况下我找后端大佬拿到了他们实现渐变的函数,代码如下:

    //圆形渐变
    private static IMOperation createCycleGradientIMOperation(Integer originalWidth, Integer originalHeight, Double midpoint) throws Exception {
        if (midpoint == null) {
            midpoint = 0.0;
        }
        if (midpoint < 0 || midpoint > 1) {
            throw new IllegalArgumentException("midpoint must be 0 to 1. midpoint:" + midpoint);
        }
        int opacityWidth, opacityHeight;
        opacityWidth = (int)(midpoint * originalWidth / 2);
        opacityHeight = (int)(midpoint * originalHeight / 2);
        IMOperation op = new IMOperation();
        op.openOperation();
        op.size(originalWidth, originalHeight);
        op.addRawArgs("xc:white");
        op.alpha("Set");
        op.channel("A");
        double dd;
        if (midpoint == 1) {
            dd = 1;
        } else {
            dd = 1.0 / (originalWidth / 2 - opacityWidth);
        }
        String expression = String.format("ot=h/w;xi=abs(i-(w/2));yj=abs(j-(h/2));xo=%d;yo=%d;rro=hypot(xo,yo);rr=hypot(w/2,h/2);dd=%f;w&gt;h?1-((sqrt(xi^2*ot^2+xi^2+(yj^2/ot^2)+yj^2))-rro)*dd:1-((sqrt(yj^2*ot^2+xi^2+(xi^2/ot^2)+yj^2))-rro)*dd", opacityWidth, opacityHeight, dd);
        op.fx(expression);
        op.closeOperation();
        op.addImage();
        op.compose("atop");
        op.composite();
        return op;
    }
    //矩形渐变
    private static IMOperation createRectangleGradientIMOperation(Integer originalWidth, Integer originalHeight, Double midpoint) throws Exception {
        if (midpoint == null) {
            midpoint = 0.0;
        }
        if (midpoint < 0 || midpoint > 1) {
            throw new IllegalArgumentException("midpoint must be 0 to 1. midpoint:" + midpoint);
        }
        int opacityWidth, opacityHeight;
        opacityWidth = (int)(midpoint * originalWidth / 2);
        opacityHeight = (int)(midpoint * originalHeight / 2);
        IMOperation op = new IMOperation();
        op.openOperation();
        op.size(originalWidth, originalHeight);
        op.addRawArgs("xc:white");
        op.alpha("Set");
        op.channel("A");
        String expression = String.format("ot=h/w;xi=abs(i-(w/2));yj=abs(j-(h/2));xo=%d;yo=%d;rro=hypot(xo,yo);rr=hypot(w/2,h/2);dd=1/(rr-rro);yj&gt;xi*ot?1-((hypot(yj/ot,yj)-rro)*dd):1-((hypot(ot*xi,xi)-rro)*dd)", opacityWidth, opacityHeight);
        op.fx(expression);
        op.closeOperation();
        op.addImage();
        op.compose("atop");
        op.composite();
        return op;
    }
    //菱形渐变
    private static IMOperation createDiamondGradientIMOperation(Integer originalWidth, Integer originalHeight, Double midpoint) throws Exception {
        if (midpoint == null) {
            midpoint = 0.0;
        }
        if (midpoint < 0 || midpoint > 1) {
            throw new IllegalArgumentException("midpoint must be 0 to 1. midpoint:" + midpoint);
        }
        int opacityWidth, opacityHeight;
        opacityWidth = (int)(midpoint * originalWidth / 2);
        opacityHeight = (int)(midpoint * originalHeight / 2);
        IMOperation op = new IMOperation();
        op.openOperation();
        op.size(originalWidth, originalHeight);
        op.addRawArgs("xc:white");
        op.alpha("Set");
        op.channel("A");
        double dd;
        if (midpoint == 1) {
            dd = 1;
        } else {
            dd = 1.0 / (originalWidth / 2 - opacityWidth);
        }
        String expression = String.format("ot=h/w;xi=abs(i-(w/2));yj=abs(j-(h/2));xo=%d;yo=%d;dd=%f;1-((xi+(yj/ot)-xo)*dd)", opacityWidth, opacityHeight, dd);
        op.fx(expression);
        op.closeOperation();
        op.addImage();
        op.compose("atop");
        op.composite();
        return op;
    }
    

    尽管代码的数量并不多,而且看起来很简单,但是一开始并不清楚,然后在我意识到这些代码中最关键的部分是表达式之前,我冷静下来考虑一下。 这个表达式是干什么用的? 实际上,它是处理每个像素,即通过某种算法改变每个像素的值以实现梯度。 实际上,这在我们理解之后更加简单。 我们只需要通过konvajs取出图像的像素数据,并使用上面表达式中的公式处理每个像素的数据,然后将旧像素数据替换为处理后的新像素数据。 最好检查官方网站的API以获取特定的API。 您可以查看文章末尾的演示,下面是我根据自己的理解转换的javascript代码并进行了简单的包装:

    const gradientFixer = {
        radial: function(w, h, i, j, ow, oh, dd) {
            const ot = h / w;
            const xi = Math.abs(i - (w / 2));
            const yj = Math.abs(j - (h / 2));
            const xo = ow;
            const yo = oh;
            const rro = Math.hypot(xo, yo);
            const rr = Math.hypot(w / 2, h / 2);
            if (w > h) {
                return Math.round(255 * (1 - (Math.sqrt(Math.pow(xi, 2) * Math.pow(ot, 2) + Math.pow(xi, 2) + (Math.pow(yj, 2) / Math.pow(ot, 2)) + Math.pow(yj, 2)) - rro) * dd));
            } else {
                return Math.round(255 * (1 - ((Math.sqrt(Math.pow(yj, 2) * Math.pow(ot, 2) + Math.pow(xi, 2) + (Math.pow(xi, 2) / Math.pow(ot, 2)) + Math.pow(yj, 2))), rro) * dd));
            }
        },
        rect: function(w, h, i, j, ow, oh, dd) {
            const ot = h / w;
            const xi = Math.abs(i - (w / 2));
            const yj = Math.abs(j - (h / 2));
            const xo = ow;
            const yo = oh;
            const rro = Math.hypot(xo, yo);
            const rr = Math.hypot(w / 2, h / 2);
            if (yj > xi * ot) {
                return Math.round(255 * (1 - (Math.hypot(yj / ot, yj) - rro) * dd));
            } else {
                return Math.round(255 * (1 - (Math.hypot(ot * xi, xi) - rro) * dd));
            }
        },
        diamond: function(w, h, i, j, ow, oh, dd) {
            const ot = h / w;
            const xi = Math.abs(i - (w / 2));
            const yj = Math.abs(j - (h / 2));
            const xo = ow;
            const yo = oh;
            const rro = Math.hypot(xo, yo);
            const rr = Math.hypot(w / 2, h / 2);
            return Math.round(255 * (1 - ((xi + (yj / ot) - xo) * dd)));
        }
    };
    /**
     * 生成渐变效果
     * @param {[type]} imageData 像素数据
     * @param {[type]} midPoint 中心点
     * @param {String} type 渐变类型
     */
    function gradient(imageData, midPoint, type = 'radial') {
        const { width, height } = imageData;
     
        const midpoint = midPoint || 0;
     
        if (midpoint < 0 || midpoint > 1) {
            throw new Error('midpoint must be 0 to 1. current midpoint is:' + midpoint);
        }
     
        const opacityWidth = Math.floor(midpoint * width / 2);
        const opacityHeight = Math.floor(midpoint * height / 2);
     
        const newImageData = new ImageData(width, height);
     
        let dd;
        if (midpoint === 1) {
            dd = 1;
        } else {
            dd = 1 / (width / 2 - opacityWidth);
        }
     
        const fixFunction = gradientFixer[type];
     
        if (fixFunction) {
            for (let i = 0, data = imageData.data; i < height; i++) {
                for (let j = 0; j < width; j++) {
                    const index = i * width * 4 + j * 4,
                        r = data[index],
                        g = data[index + 1],
                        b = data[index + 2];
                    const a = fixFunction(width, height, j, i, opacityWidth, opacityHeight, dd);
                    imageData.data[index] = r;
                    imageData.data[index + 1] = g;
                    imageData.data[index + 2] = b;
                    imageData.data[index + 3] = a;
                }
            }
        }
    }
    

    如果看懂了上面的代码了,后面的实现就很简单了,这里就不做赘述了哈。欢迎大家指错!!

    展开全文
  • PySDL2,但是由于遗留原因,还使用了aggdraw(使用Pillow包装PIL)。一般来说,SDL2运行与OpenGL的交互,以及大多数UI功能,但是aggdraw可以预见地完成绘图。在我写了一个非常基本的函数。除了鼠标移动和渐变绘制之间...

    一般的问题

    我需要创建一个任意半径的圆形渐变,并将其映射到当前鼠标位置。该项目主要使用OpenGL&amp;PySDL2,但是由于遗留原因,还使用了aggdraw(使用Pillow包装PIL)。一般来说,SDL2运行与OpenGL的交互,以及大多数UI功能,但是aggdraw可以预见地完成绘图。在

    我写了一个非常基本的函数。除了鼠标移动和渐变绘制之间的延迟随着渐变半径的增加而急剧增加(请参阅我的代码;原因很明显)。在

    下面的代码使用aggdraw;aggdraw对象通过numpy转换为字节数组传递给OpenGL。在

    我对使用SDL2绘图库的解决方案持开放态度,但我从未使用过它,我希望能像对待这样的解决方案一样对待我。;)

    特定上下文的注释

    由于我提供的代码太少了,出于礼貌,我应该提到这个与我编写了~1年(KLIBS)的大型模块的接口。上述模块主要做了很多不恰当的事情,但是,下面的函数可以插入到大量内部代码中。唉,我还没有为这个模块编写文档,因为它(目前)是针对本地上下文的。在

    这个函数是,但是我的代码是逐字的;库的其余部分都经过了很好的测试;其他任何操作的开销都是&lt;10ms。在

    我认为这一定有可能比屏幕刷新率更快,因为是一个30毫秒的延迟容忍度(项目背景是视觉认知科学的研究生工作)。我知道这也取决于硬件;一般来说,我们所说的iMac电脑不超过3年。在

    我确信这可以做得更好,但我已经超出了我的深度;我通常使用web语言(javascript/PHP/html/css)工作!在def mouse_gradient(radius):

    mp = mouse_pos() # custom function, just wraps fetching mouse coords from sdl2

    mouse_grad = None

    mouse_grad = aggdraw.Draw('RGBA', (radius, radius), (0, 0, 0, 0))

    for n in range(radius):

    n = float(n)

    r = float(radius - n)

    opacity = int(( 0.25 * n / radius) * 100)

    brush = aggdraw.Brush((255, 0, 0), int(opacity))

    tl = (radius - r) // 2 # ie. top-left

    br = (radius - r) // 2 + r # ie. bottom-right

    mouse_grad.ellipse((tl, tl, br, br), brush)

    return mouse_grad # where it is subsequently blit to the screen

    展开全文
  • 包装我们之前编写的所有内容@supports。这样,它只能在现代浏览器中呈现。 然后,在@supports块外,为文本设置后备颜色。它可能应该是出现在你的渐变中的颜色,并且可以与设计的其余部分很好地配合使用。 /* ...
  • 实现文字的渐变效果

    千次阅读 2016-04-12 12:01:23
    CAGradientLayer 是用来生成两种或更多颜色平滑渐变的 也是一个图层,layer的mask属性也是一个图层(CALayer),mask属性就像一个饼干切割机,mask图层的不透明的部分会被保存下来,透明的部分会被抛弃,也就是说 一...
  • Flutter自定义渐变色AppBar

    千次阅读 2019-03-05 10:53:28
    最近项目组决定使用 Flutter 来做新的App,在开发过程中遇到了这样的一个需求,渐变色的AppBar。 就是这样的,类似于 QQ 中的AppBar: 像 Flutter 这样强大的 UI 库,先看一下AppBar的属性。 AppBar({ Key key, ...
  • 包装您的项目( div , a , li等),但span除外 $('#foo').lmaoGradient(); 选项 $('#foo').lmaoGradient({ spaceIncluded : true, join : false, joinElement : 'a', gradientColor : [ [166, 181, 210],
  • Gradient View是围绕CGGradient的简单UIView包装器。 用法 // Initialize a gradient view let gradientView = GradientView ( frame : CGRect ( x : 20 , y : 20 , width : 280 , height : 280 )) // Set the ...
  • swiper-页面的翻页动画--渐变效果

    千次阅读 2016-07-04 21:24:57
    这次内容我们介绍在swiper页面的翻页动画--渐变效果 既然有翻页,那么肯定少不了翻页效果,这个功能在swiper当中也给我们进行了包装,所以我们在使用的时候变得非常的方便。 首先进行基本的布局以及CSS样式的设置。 ...
  • CAGradientLayer颜色渐变

    2016-04-12 16:31:04
    CAGradientLayer颜色渐变
  • 应用领域涉及平面设计、VI设计、插画绘制、产品包装、网页设计、效果图制作等。其强大的功能和无限的创意空间,在平面设计中扮演着不可或缺的角色 通过“21互联远程教育网”推出的《photoshop cs视频教程》可以使...
  • 应用领域涉及平面设计、VI设计、插画绘制、产品包装、网页设计、效果图制作等。其强大的功能和无限的创意空间,在平面设计中扮演着不可或缺的角色 通过“21互联远程教育网”推出的《photoshop cs视频教程》可以使...
  • 应用领域涉及平面设计、VI设计、插画绘制、产品包装、网页设计、效果图制作等。其强大的功能和无限的创意空间,在平面设计中扮演着不可或缺的角色 通过“21互联远程教育网”推出的《photoshop cs视频教程》可以使...
  • 狗肉丁包装铁盒的制作;工具命令包括 矩形工具 圆角矩形工具 钢笔工具 渐变工具 混合工具 文字工具 剪切蒙版;STEP01 在菜单栏里选择文件新建命令在弹出的新建文档对话框中设置各项参数单击确定按钮新建文档;STEP02 ...
  • 包装类也可以使用自定义规范指标进行扩展,以允许“渐变蒙版”和“渐变剪切”。 包装类: NormalizedOptimizer :根据该梯度的范数对梯度进行归一化。 ClippedOptimizer :按该梯度的范数修剪该梯度。 注意:仅...
  • 内容简介:分析 Flutter 中AppBar 的实现,完成渐变色GradientAppBar 。问题最近项目组决定使用 Flutter 来做新的App,在开发过程中遇到...
  • 2.选择工具箱的矩形工具延页面左上角向右下方拖拽绘制一个矩形并填充渐变颜色描边色设置为无色设置渐变颜色为C9.02,M95.69,Y100K0和C57.65,M99.23,Y100,K51.3在渐变调板中设置渐变类型为径向其他参数采用
  • 我们已为您提供各种职业每天使用的字体,从图形设计、出版和插图到包装设计、签名制作、广告和网站设计。4、字体筛选和搜索功能通过增强的字体筛选功能,节省高贵设计时间。快速找到您所需的特定字体,而无需花时间...
  • ;圣诞节海报制作;...在渐变框弄出三个5个渐变块 第一个R152 G93 B40 第二个R255 G230 B110 第三个R227 G191 B79;1.在空白处随意画一个圆;再将渐变条调整一下位置形成一个过度;使用网格工具横竖各添加四条
  • 视觉效果 该存储库是UIVisualEffectView和...这会将VisualEffectBlur放置在线性渐变上,并且模糊内的某些文本具有VisualEffectBlur效果。 import SwiftUI import VisualEffects struct ContentView : View { var
  • 4.选择渐变工具对瓶身和瓶盖进行填充瓶盖参数如下图 将瓶盖复制并适当缩小去除轮廓线;5.绘制矩形填充白色去除轮廓线复制出多个再用图框精确 剪裁命令得到下图效果 ;6.找出树叶素材用图框精确剪裁命令放置在瓶身中...
  • 早上设计师妹子把设计稿交付过来,乍一看,上面的文字颜色渐变的,而且文字内容是动态的,也就是我们无法用图片来代替。 作为一个有责任担当的汉子,坚决不能说不行。想起了CSS3...
  • 包装计算机辅助设计软件应用-Illustrator实训指导书 设计名称 产品包装的展示制作 设计素材 设计效果图 设计步骤 1.新建一个宽度为210mm 高度为285mm 的页面 绘制矩形并对其填充应用渐变色 置入文件素材--花纹瓶子 ...
  • 包装计算机辅助设计软件应用;工具命令包括 矩形工具 螺旋线工具 画笔符号 文字渐变 剪切蒙版;步骤一执行菜单中文件/新建命令 宽度为180mm高度为135mm;步骤二使用矩形工具 绘制一个矩形菜单中的窗口/渐变命令类型为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,205
精华内容 2,482
关键字:

包装渐变