将 PNG 拆分为 RGB 和 Alpha 通道

2023-12-10

我正在尝试对 PNG 文件进行一些自动处理,它接受 RGBa .png 文件并输出两个 jpeg 文件:1 个只是 RGB 通道,另一个只是 alpha 通道,作为灰度图像。

有什么方法可以在 C# 中本地执行此操作吗?如果需要第三方库,只要它是免费/开源的就可以,但我更愿意直接使用 GDI 或其他东西来完成。


这是我的工作代码:

    /// <summary>
    /// Split PNG file into two JPGs (RGB and alpha)
    /// </summary>
    private void SplitPngFileIntoRGBandAplha(string imagePath)
    {
        try
        {
            // Open original bitmap
            var bitmap = new Bitmap(imagePath);

            // Rectangle 
            var rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);

            // Get RGB bitmap
            var bitmapInRgbFormat = bitmap.Clone(rect, PixelFormat.Format32bppRgb);

            // Read bitmap data
            BitmapData bmData = bitmap.LockBits(rect, ImageLockMode.ReadOnly, bitmap.PixelFormat);

            // Prepare alpha bitmap
            var alphaBitmap = new Bitmap(bmData.Width, bmData.Height, PixelFormat.Format32bppRgb);

            for (int y = 0; y <= bmData.Height -1; y++)
            {
                for (int x = 0; x <= bmData.Width -1; x++)
                {
                    Color PixelColor = Color.FromArgb(Marshal.ReadInt32(bmData.Scan0, (bmData.Stride * y) + (4 * x)));
                    if (PixelColor.A > 0 & PixelColor.A <= 255)
                    {
                        alphaBitmap.SetPixel(x, y, Color.FromArgb(PixelColor.A, PixelColor.A, PixelColor.A, PixelColor.A));
                    }
                    else
                    {
                        alphaBitmap.SetPixel(x, y, Color.FromArgb(0, 0, 0, 0));
                    }
                }
            }

            bitmap.UnlockBits(bmData);

            // Prepare JPG format
            ImageCodecInfo jgpEncoder = GetEncoder(ImageFormat.Jpeg);
            var encoder =  Encoder.Quality;
            var encoderParameters = new EncoderParameters(1);
            var encoderParameter = new EncoderParameter(encoder, 100L);
            encoderParameters.Param[0] = encoderParameter;

            // Save RGB bitmap
            bitmapInRgbFormat.Save(imagePath.Replace("png", "jpg"), jgpEncoder, encoderParameters);

            // Save Alpha bitmpa
            alphaBitmap.Save(imagePath.Replace(".png", "_alpha.jpg"), jgpEncoder, encoderParameters);

            bitmap.Dispose();
            bitmapInRgbFormat.Dispose();
            bitmap.Dispose();

            // Delete bitmap
            System.IO.File.Delete(imagePath);
        }
        catch(Exception e)
        {
             // Handle exception
        }

    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 PNG 拆分为 RGB 和 Alpha 通道 的相关文章

  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 重载<<的返回值

    include
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 通过 htaccess 将 PNG 解析为 PHP 仅适用于本地服务器,但不适用于网络服务器

    我用 PHP 创建了一个动态 PNG 图片 为了使用 PNG 扩展名 我创建了一个包含以下内容的 htaccess 文件 AddType application x httpd php png 在我的本地 XAMPP 服务器上 一切工作正常
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new

随机推荐

  • Shenandoah 2.0 消除转发指针

    In Shenandoah 1 0每个对象都有一个额外的标头 称为forwarding pointer 为什么需要这样做以及导致其被消除的原因是什么Shenandoah 2 0 首先 每个 java 对象都有两个标头 klass and m
  • 在 jQuery 中,同时使用 resizing() 和draggable() 时如何修复包含错误? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 在 jQuery 中 同时使用 resizing 和d
  • R:如何根据列中的值添加行

    我有一个如下所示的数据框 line c 1 2 NA 4 5 NA 7 group c 1 0 Group A 2 0 Group B 3 0 Group C 4 0 Group D 5 0 Group E 6 0 Group F 7 0
  • simplexml 错误处理 php

    我正在使用以下代码 function GetTwitterAvatar username xml simplexml load file http twitter com users username xml imgurl xml gt p
  • shell中管道组件的执行顺序

    ls wc 按什么顺序ls and wc在这里执行 或者是 and wc只是论点ls 在表达式中ls wc 您的 shell 将大致执行以下操作 启动两个子 shell A 和 B A 的标准输出连接到 B 的标准输入 在子 shell A
  • 在 javascript 中设置子字符串的样式

    你好 我正在尝试使用 javascript 设置子字符串的样式 这是我的代码 function runtest document getElementById test1 innerHTML substring 0 2 style font
  • 结构的大小如何随不同数据类型而变化

    我使用的是 Linux 32 位操作系统 和 GCC 编译器 我尝试了三种不同类型的结构 在第一个结构中我只定义了一个char多变的 该结构的大小为 1 这是正确的 在第二个结构中我只定义了一个int多变的 这里结构的大小显示为 4 这也是
  • 与所定义的类具有相同类型的 static constexpr 成员

    我希望 C 类有一个 C 类型的静态 constexpr 成员 这在 C 11 中可能吗 尝试1 struct Foo constexpr Foo static constexpr Foo f Foo constexpr Foo Foo f
  • 持续运行后台服务

    我的目标是 sdk 版本 27 最低版本为 19 并尝试获得在后台持续运行的服务 我尝试了不同的服务启动选项 但它仍然被该应用程序杀死 我尝试使用 BroadcastReceiver 在服务被杀死时启动该服务 但这给了我一个错误 指出该应用
  • Cube.js 后端出现错误继续等待问题

    我在连接到 AWS 无服务器上的cube js 后端并在前端仪表板中执行 cubejs api v1 load 请求时遇到一些问题 我不断得到 error Continue wait 而不是返回结果 我遵循react dashboard指南
  • 为什么这个作业在函数之外不起作用?

    这是我正在发生的事情的一个例子 第一段代码将不起作用 typedef struct char desc unsigned quantity item item inventory INVENTORY SIZE item thing This
  • 在哪里可以找到 ncso.jar?

    我正在尝试开发一个应用程序 它将远程连接到 Lotusnote 服务器 据我所知 我应该将 ncso jar 文件添加到我的应用程序中 以启用对 Lotus Note domino 服务器的远程访问 因此 我将不胜感激帮助我下载此文件 您可
  • 从 iPhone 应用程序发送推文

    我想向我的应用程序添加一个简单的有限 Twitter 功能 应用程序的用户输入他的 Twitter 用户名和密码以及推文文本 然后按下按钮并发送推文 我的应用程序可以处理成功或失败的通知 例如 如果密码或用户名无效 我保证我已经观看了一百个
  • “HMODULE LoadLibraryA(LPCSTR)”:无法将参数 1 从“const _Elem *”转换为“LPCSTR”

    在 vc 中我有一个包含两个项目的解决方案 项目 A 有一个dllLoader h and dllLoader cpp它加载一个dll with LoadLibrary我需要在项目B中调用它的函数 所以我将头文件和cpp文件复制并粘贴到项目
  • c# jquery 未将对象引用设置为对象的实例

    我有一个 C 中的 Web 服务 我从我的 jquery 脚本中调用它 这是c 中的web服务 WebMethod ScriptMethod UseHttpGet true public void LoadService2Daily str
  • React 项目 WAR 文件

    我正在使用 React 开发一个 Web 应用程序 我想为该项目制作一个可部署的 WAR 文件 如果有人可以提供良好的资源或者可以帮助我 我需要帮助吗 首先 添加一个pom xml并将其设为maven项目 然后构建它 它会在目标文件夹中为您
  • 如何使用终端在 Mac OS X 上运行 C 程序?

    我是 C 语言新手 这是我的 Hello World 程序 include
  • 将县边界映射到 ggmap

    我正在生成一些地图 我想在地图上显示县的边界ggmap路线图 这是使用德克萨斯州部分地区的示例 library ggmap map get map location c 95 31619 28 42460 zoom 6 source goo
  • 无法启动 Android 12 AVD,但可以启动 Android 11 AVD

    我一直在使用 Android 11 AVD 开发和测试我的应用程序 没有出现任何问题 现在我想测试 Android 12 并使用 Android 12 映像创建一个新的 AVD 但是当我启动 AVD 时 它会生成一个 qemu 进程 但我没
  • 将 PNG 拆分为 RGB 和 Alpha 通道

    我正在尝试对 PNG 文件进行一些自动处理 它接受 RGBa png 文件并输出两个 jpeg 文件 1 个只是 RGB 通道 另一个只是 alpha 通道 作为灰度图像 有什么方法可以在 C 中本地执行此操作吗 如果需要第三方库 只要它是