如何用颜色填充图像的一部分?

2024-02-21

我在表单中添加了图像。如何填充部分图像?

我有这个

我想要实现的目标:


To 洪水填埋一个你只需要日常食品填充的区域,几乎不需要其他任何东西。

看这个例子:

它使用两个图片框,还有一个用于显示所选颜色的标签。

还有两个鼠标单击事件,其中一个用于选择颜色:

private void pictureBoxPalette_MouseClick(object sender, MouseEventArgs e)
{
    Point sPt = scaledPoint(pictureBoxPalette, e.Location);
    lbl_color.BackColor = ((Bitmap)pictureBoxPalette.Image).GetPixel(sPt.X, sPt.Y);
}

..还有一个称为填充的:

private void pictureBoxTgt_MouseClick(object sender, MouseEventArgs e)
{
    Point sPt = scaledPoint(pictureBoxTgt, e.Location);
    Bitmap bmp = (Bitmap)pictureBoxTgt.Image;
    Color c0 = bmp.GetPixel(sPt.X, sPt.Y); 
    Fill4(bmp, sPt, c0, lbl_color.BackColor);
    pictureBoxTgt.Image = bmp;
}

Floodfill 例程取自这个帖子 https://stackoverflow.com/questions/28373615/create-custom-shape-for-button/28376826?s=4%7C0.2653#28376826;它基本上是一个直接实现维基百科 http://en.wikipedia.org/wiki/Flood_fill#Alternative_implementations算法..:

static void Fill4(Bitmap bmp, Point pt, Color c0, Color c1)
{
    Color cx = bmp.GetPixel(pt.X, pt.Y);
    if (cx.GetBrightness() < 0.01f) return;  // optional, to prevent filling a black grid
    Rectangle bmpRect = new Rectangle(Point.Empty, bmp.Size);
    Stack<Point> stack = new Stack<Point>();
    int x0 = pt.X;
    int y0 = pt.Y;

    stack.Push(new Point(x0, y0) );
    while (stack.Any() )
    {
        Point p = stack.Pop();
        if (!bmpRect.Contains(p)) continue;
        cx = bmp.GetPixel(p.X, p.Y);
        if (cx.ToArgb() == c0.ToArgb())  //*
        {
            bmp.SetPixel(p.X, p.Y, c1);
            stack.Push(new Point(p.X, p.Y + 1));
            stack.Push(new Point(p.X, p.Y - 1));
            stack.Push(new Point(p.X + 1, p.Y));
            stack.Push(new Point(p.X - 1, p.Y));
        }
    }
}

注意:(*) 如果其中一种颜色是已知或命名的颜色,则颜色相等将会失败。所以我们需要转换为通用格式。

Update

我已经更新了代码以包含一个将鼠标单击位置缩放到图像像素点的函数;现在它将与SizeMode=StretchImage同样,这样你就可以处理整个图像..

static Point scaledPoint(PictureBox pb, Point pt)
{
    float scaleX = 1f * pb.Image.Width / pb.ClientSize.Width;
    float scaleY = 1f * pb.Image.Height / pb.ClientSize.Height;
    return  new Point((int)(pt.X * scaleX), (int)(pt.Y * scaleY));
}

当然,您可以保存图像。

请注意,您的原始图像是 4bpp,在着色之前必须转换为 24bpp 或更好。

另请注意,对于SizeMode=Zoom计算有点复杂。这是一个应该适用于任何SizeMode.:

static Point scaledPoint(PictureBox pbox, Point pt)
{
    Size si = pbox.Image.Size;
    Size sp = pbox.ClientSize;
    int left = 0;
    int top = 0;

    if (pbox.SizeMode == PictureBoxSizeMode.Normal ||
        pbox.SizeMode == PictureBoxSizeMode.AutoSize) return pt;
    if (pbox.SizeMode == PictureBoxSizeMode.CenterImage)
    {
        left = (sp.Width - si.Width) / 2;
        top = (sp.Height - si.Height) / 2;
        return new Point(pt.X - left, pt.Y - top);
    }                   
    if (pbox.SizeMode == PictureBoxSizeMode.Zoom)
    {
        if (1f * si.Width / si.Height < 1f * sp.Width / sp.Height)
            left = (sp.Width - si.Width * sp.Height / si.Height) / 2;
        else
            top = (sp.Height - si.Height * sp.Width / si.Width) / 2;
    }

    pt = new Point(pt.X  - left, pt.Y - top);
    float scaleX = 1f * pbox.Image.Width / (pbox.ClientSize.Width - 2 * left) ;
    float scaleY = 1f * pbox.Image.Height / (pbox.ClientSize.Height - 2 * top);
    return new Point((int)(pt.X * scaleX), (int)(pt.Y * scaleY));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用颜色填充图像的一部分? 的相关文章

随机推荐

  • VSCode的默认设置文件的位置在哪里?

    在 Windows 计算机上 VS Code 用户设置文件位于 AppData Code User settings json 当我们从上述位置打开用户设置文件或转到左侧窗格中时 包含默认设置的文件的位置是什么 文件 gt 首选项 gt 设
  • Scada-Lts - “未指定数据源”错误

    我尝试使用 jdk 1 7 在 Tomcat 7 上运行 Scada Lts 但出现以下错误 SEVERE Exception sending context initialized event to listener instance o
  • 如何使用 Process.Start("outlook.exe") 运行 Outlook 并重新获得控制权

    我的 C 程序需要启动 Office Outlook 并获取当前的 正在运行的 Outlook 应用程序 为了做到这一点 我实现了以下简单的程序 所以如果你愿意 你可以简单地测试它 using Outlook Microsoft Offic
  • .NET 的状态机框架

    我工作中的系统基本上是一个消息驱动的状态机 它接收各种类型的消息 根据消息查找某些上下文 状态 然后根据消息和当前状态决定要做什么 通常结果是一条消息被发送到系统之外 有没有好的开源框架可以在 NET 中实现状态机 我研究了最新版本的 Wi
  • Oracle sql MERGE INTO 带有单个 where 子句

    我有以下 SQL 代码 这是我到目前为止所得到的 MERGE INTO SCHEMA1 TABLE 1 table1 USING SELECT DISTINCT table2 column1 view1 column2 FROM SCHEM
  • 如何在 PHP 中使用 RegexIterator

    我还没有找到如何使用 php RegexIterator 递归遍历目录的好例子 最终结果是我想指定一个目录并查找其中具有某些给定扩展名的所有文件 例如只说 html php 扩展 此外 我想过滤掉 Trash 0 Trash 500 等类型
  • 可以禁用@media查询或强制解决吗?原因:允许 iPhone 查看桌面网站吗?

    我通过 media 查询对我的网站进行了大幅修改 以在手机上显示得非常精简 但是 我的用户要求提供该网站的桌面版本 可通过链接获取 更进一步 桌面站点本身也会根据分辨率被 media 查询修改 我正在考虑选择一种 桌面 分辨率 例如 144
  • 未选取环回 4 测试配置

    我跟着Loopback4 数据源 https loopback io doc en lb4 DataSources html文档并放置样本 数据源 json and 样本 测试 数据源 json文件下src 数据源 每当我跑步时npm ru
  • Java CGI 与 Servlet [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Tweepy 错误代码 400

    我正在尝试下载一些推文用于研究目的 直到几天前 代码都运行得很好 错误信息 gt Traceback most recent call last gt gt File
  • 编译时如何使用通配符包含 JAR 文件?

    我在 java 文件 MyRtmpClient java 中有以下内容 import org apache mina common ByteBuffer and ByteBuffer位于 JAR 文件内 当然具有正确的目录结构 该 jar
  • JQuery Ajax post 参数有时不会在 IE 上发送

    我遇到的问题是 当我使用 jquery ajax post 时 频率非常低 当我将呼叫从 post 类型切换为 get 类型时 问题就消失了 有没有其他人在 IE 上见过这种奇怪的行为 谢谢 我已经在各种 ajax 调用中看到过这种情况 但
  • 使用 Azure Function 删除 CosmosDB 条目

    我一直在寻找一种技术 通过浏览器内的代码编辑器 使用 Azure Functions 删除 Cosmos 数据库中的项目 我不想在 VS 上使用本地开发的代码有多种原因 我正在使用的代码可用here https pastebin com X
  • 向 ASP.NET Web API 控制器添加显式操作路由

    我有一个 ASP NET Web API 项目ApiController提供了一个User端点具有以下操作 GET api User POST api User DELETE api user 我想提供以下端点 GET api user m
  • 单元测试与验收测试

    你支持其中之一吗 或两者 我的理解是单元测试 从开发人员的角度验证系统 帮助开发者实践TDD 保持代码模块化 协助检测低粒度的错误 验收测试 从业务和 QC QA 角度验证系统 往往是高级别的 因为它们通常是由不熟悉代码内部工作原理的人编写
  • WebRTC - 禁用所有音频处理

    我目前正在尝试通过 webrtc 获得尽可能干净的音频通道 通过 getUserMedia mediaconstraints 对象 我设置了以下选项 constraints audio mandatory echoCancellation
  • git pre-receive hook - 获取最新代码

    我正在尝试写一个pre receive hook对于 git 来说 它将拉取正在推送的最新版本的代码并对其运行单元测试 我的代码如下 但是当它到达 git checkout newrev 时 我得到 远程 致命 引用不是树 188de39c
  • 球体/地球仪上的点与多边形之间的最短大圆距离

    我有一组由地理 WGS84 坐标指定的多边形 它们位于球体上 我有一个由纬度 经度对指定的点 我想 有效地 找到点和多边形之间的最小大圆距离 我当前的堆栈包括 fiona shapely gdal 和 proj StackOverflow
  • Hystrix 忽略运行超时

    我正在尝试使用 Hystrix 我理解文档 即使通过 运行 同步调用 Hystrix 命令也会默认在线程中运行 并且应该受到 Hystrix 中配置的超时的影响 但当我尝试时 似乎没有发生超时 我是否误解了文档 或者我做错了什么 有没有办法
  • 如何用颜色填充图像的一部分?

    我在表单中添加了图像 如何填充部分图像 我有这个 我想要实现的目标 To 洪水填埋一个你只需要日常食品填充的区域 几乎不需要其他任何东西 看这个例子 它使用两个图片框 还有一个用于显示所选颜色的标签 还有两个鼠标单击事件 其中一个用于选择颜