C# DeOldify 黑白照片 老照片上色

news2024/11/19 8:51:10

效果

项目

代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.TaskBand;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.ToolBar;

namespace DeOldify_黑白照片_老照片上色
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string fileFilter = "Images (*.bmp; *.emf; *.exif; *.gif; *.ico; *.jpg; *.png; *.tiff; *.wmf)|*.bmp; *.emf; *.exif; *.gif; *.ico; *.jpg; *.png; *.tiff; *.wmf|All files|*.*";
        string image_path = "";

        DateTime dt1 = DateTime.Now;
        DateTime dt2 = DateTime.Now;

        string startupPath;
        string model;

        /// <summary>
        /// Input image.
        /// </summary>
        private Bitmap __Input;

        /// <summary>
        /// Output image.
        /// </summary>
        private Bitmap __Output;

        /// <summary>
        /// Normal output image.
        /// </summary>
        private Bitmap __NormalOutput;

        /// <summary>
        /// Blurrified input image.
        /// </summary>
        private Bitmap __BlurryInput;

        /// <summary>
        /// Blurrified output image.
        /// </summary>
        private Bitmap __BlurryOutput;



        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = fileFilter;
            if (ofd.ShowDialog() != DialogResult.OK) return;
            pictureBox1.Image = null;
            image_path = ofd.FileName;
            __Input = new Bitmap(image_path);

            //__BlurryInput = __Blurify(__Input);

            pictureBox1.Image = __Decolorize(__Input);
            textBox1.Text = "";
            pictureBox2.Image = null;
        }

        /// <summary>
        /// Converts the image to greyscale.
        /// </summary>
        /// <param name="source">Input image.</param>
        /// <returns>Greyscale image.</returns>
        private static Bitmap __Decolorize(Bitmap source)
        {
            var result = new Bitmap(source);
            for (int y = 0; y < result.Height; ++y)
            {
                for (int x = 0; x < result.Width; ++x)
                {
                    var c = result.GetPixel(x, y);
                    var l = (byte)((c.R + c.G + c.B) / 3);
                    result.SetPixel(x, y, Color.FromArgb(c.A, l, l, l));
                }
            }
            return result;
        }

        /// <summary>
        /// Blurrifies the image.
        /// </summary>
        /// <param name="source">Input image.</param>
        /// <returns>Blurrified image.</returns>
        private static Bitmap __Blurify(Bitmap source)
        {
            var output = new Bitmap(source.Width, source.Height);
            for (int y = 0; y < output.Height; ++y)
            {
                for (int x = 0; x < output.Width; ++x)
                {
                    var a = 0f;
                    var r = 0f;
                    var g = 0f;
                    var b = 0f;
                    for (int ky = 0; ky < 5; ++ky)
                    {
                        var iy = y + ky - 2;
                        if ((iy < 0) || (iy >= source.Height))
                        {
                            continue;
                        }
                        for (int kx = 0; kx < 5; ++kx)
                        {
                            var ix = x + kx - 2;
                            if ((ix < 0) || (ix >= source.Width))
                            {
                                continue;
                            }
                            var c = source.GetPixel(ix, iy);
                            a += c.A;
                            r += c.R;
                            g += c.G;
                            b += c.B;
                        }
                    }
                    output.SetPixel(x, y, Color.FromArgb((byte)(a / 25), (byte)(r / 25), (byte)(g / 25), (byte)(b / 25)));
                }
            }
            return output;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (pictureBox1.Image == null)
            {
                textBox1.Text = "请先选择图片";
                return;
            }

            button2.Enabled = false;
            pictureBox2.Image = null;
            textBox1.Text = "";

           Task task = new Task(() =>
            {

                dt1 = DateTime.Now;

                System.Threading.Thread.Sleep(2000);

                __Output = DeOldify.Colorize(__Input);

                //if (__Output.Height > __Output.Width)
                //{
                //    __NormalOutput = new Bitmap(__Output, (int)(256f / __Output.Height * __Output.Width), 256);
                //}
                //else
                //{
                //    __NormalOutput = new Bitmap(__Output, 256, (int)(256f / __Output.Width * __Output.Height));
                //}

                //__BlurryOutput = __Blurify(__NormalOutput);

                //__Output = __NormalOutput;

                pictureBox2.Image = __Output;

                dt2 = DateTime.Now;

                textBox1.Invoke(new Action(() =>
                {
                    TimeSpan ts = dt2.Subtract(dt1);
                    textBox1.Text = "耗时:" + ts.TotalSeconds + "s";
                }));

                button2.Invoke(new Action(() =>
                {
                    button2.Enabled = true;
                }));


                //GC.Collect();

            });

            task.Start();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            startupPath = System.Windows.Forms.Application.StartupPath;
            model = "Artistic.hmodel";

            //Artistic model with half-precision floating point weights. Less accurate than original float32 model, but requires 2 times less disk space.
            //Artistic.hmodel

            //Artistic model with single-precision floating point weights. More accurate than compressed float16 model.
            //Artistic.model

            //Stable model with single-precision floating point weights. Less accurate than original float32 model, but requires 2 times less disk space.
            //Stable.hmodel

            //Stable model with single-precision floating point weights. More accurate than compressed float16 model.
            //Stable.model";

            try
            {
                DeOldify.Initialize(model);
                textBox1.Text = "模型["+ model + "]初始化成功";

                DeOldify.Progress += (float Percent) =>
                {
                    textBox1.Invoke(new Action(() =>
                    {
                        textBox1.Text = string.Format("完成进度:{0}%,请稍等……", Percent.ToString("f2"));
                    }));
                };
            }
            catch (Exception ex)
            {
                textBox1.Text = "模型初始化失败,异常信息:" + ex.Message;
            }

        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (pictureBox2.Image == null)
            {
                return;
            }

            var SFD = new SaveFileDialog();
            SFD.Title = "保存";
            SFD.Filter = "Images (*.bmp)|*.bmp|Images (*.emf)|*.emf|Images (*.exif)|*.exif|Images (*.gif)|*.gif|Images (*.ico)|*.ico|Images (*.jpg)|*.jpg|Images (*.png)|*.png|Images (*.tiff)|*.tiff|Images (*.wmf)|*.wmf";
            if (SFD.ShowDialog() == DialogResult.OK)
            {
                switch (SFD.FilterIndex)
                {
                    case 1:
                        {
                            __Output.Save(SFD.FileName, ImageFormat.Bmp);
                            break;
                        }
                    case 2:
                        {
                            __Output.Save(SFD.FileName, ImageFormat.Emf);
                            break;
                        }
                    case 3:
                        {
                            __Output.Save(SFD.FileName, ImageFormat.Exif);
                            break;
                        }
                    case 4:
                        {
                            __Output.Save(SFD.FileName, ImageFormat.Gif);
                            break;
                        }
                    case 5:
                        {
                            __Output.Save(SFD.FileName, ImageFormat.Icon);
                            break;
                        }
                    case 6:
                        {
                            __Output.Save(SFD.FileName, ImageFormat.Jpeg);
                            break;
                        }
                    case 7:
                        {
                            __Output.Save(SFD.FileName, ImageFormat.Png);
                            break;
                        }
                    case 8:
                        {
                            __Output.Save(SFD.FileName, ImageFormat.Tiff);
                            break;
                        }
                    case 9:
                        {
                            __Output.Save(SFD.FileName, ImageFormat.Wmf);
                            break;
                        }
                }
                MessageBox.Show("保存成功,位置:"+SFD.FileName);
            }

        }
    }
}

可执行程序exe下载

Demo下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1046681.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美摄美颜SDK:您的一站式美颜解决方案

在当今的数字化时代&#xff0c;美颜技术已经成为了社交媒体、直播、虚拟现实等众多在线平台的重要部分。不论是个人还是企业&#xff0c;我们都希望能够通过使用高质量的美颜SDK来提升我们的产品和服务。那么&#xff0c;如何找到最合适的美颜SDK呢&#xff1f;哪家的美颜SDK最…

C++常见设计模式

设计模式 设计模式的六大原则&#xff1a;https://zhuanlan.zhihu.com/p/110130347 适配器模式 假设Client想要一个正方形&#xff08;client Interface&#xff09;&#xff0c;但是提供的服务&#xff08;service&#xff09;是个圆形&#xff0c;那么我就把这个圆通过适配…

数据结构与算法(C语言版)P7---串、数组、广义表

串、数组、广义表大体了解 我们知道前面学过的__顺序表、链表、栈、队列__&#xff0c;这些都属于线性表。 其中__栈、队列__是操作受限的线性表。 比如&#xff1a; 栈&#xff0c;先进后出&#xff0c;只能在栈顶插入和删除数据。队列&#xff1a;先进先出&#xff0c;只…

TensorFlow入门(八、TensorBoard可视化工具的应用)

TensorBoard常用函数和类http://t.csdn.cn/Hqi9c TensorBoard可视化的过程: ①确定一个整体的图表,明确从这个图表中获取哪些数据的信息 ②确定在程序的哪些节点、以什么样的方式进行汇总数据的运算,以记录信息,比如在反向传播定义以后,使用tf.summary.scalar记录损失值的变…

金蝶云星空与旺店通·企业奇门对接集成其他出库查询打通创建其他出库单

金蝶云星空与旺店通企业奇门对接集成其他出库查询打通创建其他出库单 源系统:金蝶云星空 金蝶K/3Cloud&#xff08;金蝶云星空&#xff09;是移动互联网时代的新型ERP&#xff0c;是基于WEB2.0与云技术的新时代企业管理服务平台。金蝶K/3Cloud围绕着“生态、人人、体验”&#…

CTF_BUUCTF_Reverse解题_01earsyre

题目地址&#xff1a;BUUCTF在线评测 拿到题目解压&#xff0c;PE看哈是否加壳&#xff0c;几位的 64位&#xff0c;GCC没加壳&#xff0c;那好办了直接IDA 64淦 这不是flag就出来了吗&#xff01; 果然是easyea&#xff0c;flag&#xff1a;flag{this_Is_a_EaSyRe} CTF工具包…

传统订货方式和网上企业APP订货方式的差别|网站搭建|小程序开发

传统订货方式和网上企业APP订货方式的差别|网站搭建|小程序开发 1、管货品&#xff1a;实时关注热销和滞销商品的库存订货系统&#xff1a;采购单一键生成入库单&#xff0c;便捷的实现从采购到仓库到销售一体化的进销存管理。 传统模式&#xff1a;进销存管理难&#xff1a;…

工业物联网——定义和主要概念

工业物联网背后的理念是使用工业设施中“哑巴设备”多年来产生的数据。装配线上的智能机器不仅可以更快地捕获和分析数据&#xff0c;且在交流重要信息方面也更快&#xff0c;这有助于更快、更准确地做出业务决策。 信息技术&#xff08;IT&#xff09;和运营技术&#xff08;…

一分钟用手机搞定视频提取伴奏

上台表演需要去掉人声&#xff0c;提取伴奏&#xff0c;这个操作可以直接使用【音分轨】软件中的【视频提取伴奏】功能&#xff0c;接下来教大家具体的操作流程&#xff01; 第一步&#xff1a;在首页点击【人声分离】&#xff0c;上传需要分离的视频&#xff0c;有三种方式可以…

【python零基础入门学习】python进阶篇之高阶函数

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

一键生成,轻松制作个性化瓜分红包活动二维码

在如今竞争激烈的市场中&#xff0c;营销活动成为各个品牌推广的重要手段。而在朋友圈这个信息交流的平台上&#xff0c;如何引起用户的关注和参与&#xff0c;成为了每个营销人员的关注焦点。而打造一个引爆朋友圈的瓜分红包活动&#xff0c;无疑是一种非常有效的方法。接下来…

Win10系统怎么把桌面路径改为其他盘?

Win10系统怎么把桌面路径改为其他盘&#xff1f;Win10系统默认将桌面文件夹路径设置在系统安装盘中&#xff0c;通常是C盘。但是&#xff0c;如果Win10电脑C盘空间不足了&#xff0c;就会影响系统的正常运行。下面小编给大家介绍在Win10系统中将桌面路径改为其他盘的详细方法。…

代码随想录算法训练营第四十一天 | 动态规划 part 3 | 343. 整数拆分、96.不同的二叉搜索树

目录 343. 整数拆分思路代码 96.不同的二叉搜索树思路代码 343. 整数拆分 Leetcode 思路 dp[i] 表示 分拆数字i&#xff0c;可以得到的最大乘积为dp[i]。dp[i] max(dp[i], max((i - j) * j, dp[i - j] * j)) 贪心解法 这里粘贴一下美版 StefanPochmann 老哥的 idea&#…

Host掌控SSD内黑匣子的历史演进

在固态硬盘&#xff08;SSD&#xff09;的世界里&#xff0c;一直有一个神秘的“黑盒子”现象。这个现象指的是主机&#xff08;Host&#xff09;对SSD的控制能力有限&#xff0c;只能通过既定的接口进行基本的读写操作。但随着技术的不断发展&#xff0c;这个“黑盒子”正在被…

Day-01 从 0 开始搭建一套规范的 Vue3.x 项目工程环境

一、架构搭建 请确保你的电脑上成功安装 Node.js&#xff0c;本项目使用 Vite 构建工具&#xff01; 查看 Node.js 版本&#xff1a; ps&#xff1a; 需要注意的是vite需要你的node的版本在12以上 node -v // v16.20.1 建议将 Node.js 升级到最新的稳定版本&#xff1a;…

基于Laravel 5.6的运动健身类小程序前后端源码

基于Laravel 5.6的运动健身、健康类小程序前后端源码&#xff0c;一套比较基础的运动健康、健身类小程序源码。朋友自己无聊写的&#xff0c;比较基础&#xff0c;有需要的可以拿去修修改改升级开发一下。 使用宝塔安装&#xff0c;比较省事&#xff0c;PHP相关的扩展需要启用…

车载高速CAN(HighSpeed CAN)通信之CAN Bus Off

本文主要以普及CAN通信基本原理为目的&#xff0c;如有从事相关领域或者有意从事车载嵌入式开发的读友们欢迎留言探讨。 本文含有关键字如下。 CAN Bus Off&#xff0c;Bus Off DTC&#xff0c;Bus Off Recovery CAN Bus Off 连接到CAN网络的通信设备一般称为节点&#xff…

信息安全:恶意代码防范技术原理.

信息安全&#xff1a;恶意代码防范技术原理. 恶意代码的英文是 Malicious Code, 它是一种违背目标系统安全策略的程序代码&#xff0c;会造成目标系统信息泄露、资源滥用&#xff0c;破坏系统的完整性及可用性。 目录&#xff1a; 恶意代码概述&#xff1a; &#xff08;1&a…

mac openssl 版本到底怎么回事 已解决

在mac 安装node多版本的时候&#xff0c;有可能把原有的 openssl1.1 版本 直接要再一次升级了&#xff0c;无奈的 php环境 编译器是 openssl 1.1 还是 3.0 &#xff0c;今天来个底朝天的找问题。 brew search openssl 有安装 三个版本。 但是错误提示 是第二个版本。 brew …

知识分享 钡铼网关功能介绍:使用SSLTLS 加密,保证MQTT通信安全

背景 为了使不同的设备或系统能够相互通信&#xff0c;让旧有系统和新的系统可以集成&#xff0c;通信更加灵活和可靠。以及将数据从不同的来源收集并传输到不同的目的地&#xff0c;实现数据的集中管理和分发。 通信网关完美克服了这一难题&#xff0c;485或者网口的设备能通过…