当前位置: 首页 > news >正文

winform的helloworld

1、下载安装VC++ 2008运行库

微软官网、32位直链 - 微软官网
32位直链 - 360软件
注意:SharpDevelop需要32位的VC++ 2008运行库,64位的无效

2、下载安装SharpDevelop_5.1.0.5216_Setup.msi

SharpDevelop - sourceforge下载渠道
SharpDevelop - Github发行页面

3、设置语言

菜单栏 - Tools - Options… - General - UI Language,选择Chinese。重新启动SharpDevelop。

4、设置数据收集器

选择我不想参与,点击保存。软件已经停更了,没什么可改进的。

5、准备图片

  1. 一个背景图
    在这里插入图片描述
  2. 一个ico格式图片(图片转换为ico格式时必须使用专业软件)
    请添加图片描述

6、设计界面

菜单栏 - 文件 - 新建 - 解决方案(S)…(Ctrl+Shift+N),弹出新项目窗口
C#类别 - Windows应用程序,模板选择 Windows 应用程序
输入名称:img2base64,点击建立

在软件左数⅙下数⅓处找到并点击设计按钮,从源代码窗口切换到设计窗口
左下角找到并点击工具按钮,从项目窗口切换到工具窗口
双击img2base64主窗口,添加加载事件
选中img2base64主窗口,右侧找到属性
Layout - Size,设置为900, 300
Window Style - Icon,导入ico图标
Window Style - MaximizeBox,设置为False

左侧工具展开Windows Forms,拖拽PictureBox到设计窗口上
选中PictureBox,右侧找到属性,点击闪电图标,双击DragDropDragEnter,添加拖放和拖进事件
选中PictureBox,右侧找到属性
Layout - Location,设置为12, 12
Layout - Size,设置为237, 237
Appearance - BackgroundImage,导入本地资源,设置为背景图
Behavior - SizeMode,设置为StretchImage

拖拽Button到设计窗口上
选中Button,右侧找到属性
Layout - Location,设置为256, 12
Layout - Size,设置为75, 115
Appearance - Text,设置为图像转换为base64
双击Button,添加单击事件

再拖拽Button到设计窗口上
选中第二个Button,右侧找到属性
Layout - Location,设置为256, 133
Layout - Size,设置为75, 115
Appearance - Text,设置为base64转换为图像
双击第二个Button,添加单击事件

拖拽TextBox到设计窗口上
选中TextBox,右侧找到属性
Behavior - Multiline,设置为True
Layout - Location,设置为338, 13
Layout - Size,设置为534, 236
在这里插入图片描述

7、编写代码

MainForm.cs

/*
 * 由SharpDevelop创建。
 * 用户: 三巧(https://blog.csdn.net/qq_39124701)
 * 日期: 2023/3/28
 * 时间: 11:06
 * 
 * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件
 */
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace img2base64
{
	/// <summary>
	/// Description of MainForm.
	/// </summary>
	public partial class MainForm : Form
	{
		public ImageType current_picture_type = ImageType.None;
		
		public MainForm()
		{
			InitializeComponent();
		}
		
		void MainFormLoad(object sender, EventArgs e)
		{
			pictureBox1.AllowDrop = true;
		}
		
		void PictureBox1DragDrop(object sender, DragEventArgs e)
		{
			var items = (object)e.Data.GetData("FileNameW") as string[];
			if (items.Length == 1) {
				var img = Image.FromFile(items[0]);
				current_picture_type = ImageTypeCheck.CheckImageType(items[0]);
				var fileinfo = new System.IO.FileInfo(items[0]);
				if (fileinfo.Length > 102400) {
					MessageBox.Show("大于100KB,可能无法完全转换");
				}
				var bmp = new Bitmap(img);
				img.Dispose();
				pictureBox1.Image = bmp;
				
				pictureBox1.BackgroundImage = null;
			}
		}
		void PictureBox1DragEnter(object sender, DragEventArgs e)
		{
			e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.All : DragDropEffects.None;
		}
		
		void Button1Click(object sender, EventArgs e)
		{
			if (pictureBox1.Image == null) {
				MessageBox.Show("没有加载图片");
			}else{
				if (current_picture_type == ImageType.None) {
					MessageBox.Show("错误");
					return;
				}
				if (current_picture_type == ImageType.GIF) {
					textBox1.Text = "data:image/gif;base64," + ImageToBase64(pictureBox1, current_picture_type);
					return;
				}
				if (current_picture_type == ImageType.JPG) {
					textBox1.Text = "data:image/jpeg;base64," + ImageToBase64(pictureBox1, current_picture_type);
					return;
				}
				textBox1.Text = "data:image/png;base64," + ImageToBase64(pictureBox1, current_picture_type);
			}
		}
		void Button2Click(object sender, EventArgs e)
		{
			Base64ToImage(textBox1,pictureBox1);
		}
		
		/// <summary>
        /// base64 转 Image
        /// </summary>
        public static void Base64ToImage(TextBox textBox1, PictureBox picturebox1)
        {
        	string base64 = textBox1.Text;
            base64 = base64.Replace("data:image/png;base64,", "").Replace("data:image/jgp;base64,", "").Replace("data:image/jpg;base64,", "").Replace("data:image/jpeg;base64,", "").Replace("data:image/gif;base64,", "");
            try {
            	byte[] bytes = Convert.FromBase64String(base64);
            	var memStream = new System.IO.MemoryStream(bytes);
	            Image mImage = Image.FromStream(memStream);
	            var bp = new Bitmap(mImage);
	            picturebox1.Image = bp;
            }catch (Exception ex){
            	MessageBox.Show("无法识别为base64");
            }            
        }
 
        /// <summary>
        /// Image 转成 base64
        /// </summary>
        public static string ImageToBase64(PictureBox pictureBox1, ImageType current_picture_type)
        {
        	var bmp = (Bitmap)pictureBox1.Image;
            var ms = new System.IO.MemoryStream();
            if (current_picture_type == ImageType.PNG) {
            	bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            }else{
            	bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            var arr = new byte[ms.Length]; ms.Position = 0;
            ms.Read(arr, 0, (int)ms.Length); ms.Close();
            return Convert.ToBase64String(arr);
        }
	}
	
	  /// <summary>
    /// 实现通过文件头2个字节判断图片的格式。
    /// </summary>
    public static class ImageTypeCheck
    {
        static ImageTypeCheck()
        {
            _imageTag = InitImageTag();
        }
        private static readonly SortedDictionary<int, ImageType> _imageTag ;

        public static readonly string ErrType = ImageType.None.ToString();

        private static SortedDictionary<int, ImageType> InitImageTag()
        {
            var list = new SortedDictionary<int, ImageType>();

            list.Add((int)ImageType.BMP, ImageType.BMP);
            list.Add((int)ImageType.JPG, ImageType.JPG);
            list.Add((int)ImageType.GIF, ImageType.GIF);
            list.Add((int)ImageType.PCX, ImageType.PCX);
            list.Add((int)ImageType.PNG, ImageType.PNG);
            list.Add((int)ImageType.PSD, ImageType.PSD);
            list.Add((int)ImageType.RAS, ImageType.RAS);
            list.Add((int)ImageType.SGI, ImageType.SGI);
            list.Add((int)ImageType.TIFF, ImageType.TIFF);
            return list;

        }

        /// <summary> 
        /// 通过文件头判断图像文件的类型 
        /// </summary> 
        /// <param name="path"></param> 
        /// <returns></returns> 
        public static string CheckImageTypeName(string path)
        {
            return CheckImageType(path).ToString();
        }
        /// <summary> 
        /// 通过文件头判断图像文件的类型 
        /// </summary> 
        /// <param name="path"></param> 
        /// <returns></returns> 
        public static ImageType CheckImageType(string path)
        {
            var buf = new byte[2];
            try
            {
                using (var sr = new System.IO.StreamReader(path))
                {
                    int i = sr.BaseStream.Read(buf, 0, buf.Length);
                    if (i != buf.Length)
                    {
                        return ImageType.None;
                    }
                }
            }
            catch (Exception ex)
            {
                //Debug.Print(exc.ToString());
                return ImageType.None;
            }
            return CheckImageType(buf);
        }

        /// <summary> 
        /// 通过文件的前两个自己判断图像类型 
        /// </summary> 
        /// <param name="buf">至少2个字节</param> 
        /// <returns></returns> 
        public static ImageType CheckImageType(byte[] buf)
        {
            if (buf == null || buf.Length < 2)
            {
                return ImageType.None;
            }

            int key = (buf[1] << 8) + buf[0];
            ImageType s; 
			return _imageTag.TryGetValue(key, out s) ? s : ImageType.None; 
        }

    }

    /// <summary> 
    /// 图像文件的类型 
    /// </summary> 
    public enum ImageType
    {
        None = 0,
        BMP = 0x4D42,
        JPG = 0xD8FF,
        GIF = 0x4947,
        PCX = 0x050A,
        PNG = 0x5089,
        PSD = 0x4238,
        RAS = 0xA659,
        SGI = 0xDA01,
        TIFF = 0x4949
    }
}

8、exe文件位置

菜单栏 - 项目(P) - 打开输出文件夹

9、最终效果

在这里插入图片描述

相关文章:

  • vue3笔记
  • 基于html+css的图片旋转
  • 【iOS】ARC学习
  • 3. QML实现蓝牙通信
  • 算法第二十期——FLoyd算法的入门与应用
  • VBA之正则表达式(41)-- 替换函数声明
  • python get方法及常用的代码
  • Vue——插槽
  • uni-app的基本使用(二)
  • kubeSphere / k8s中master、worker节点启停命令操作
  • Vue内容分发
  • MySQL主从复制、读写分离(MayCat2)实现数据同步
  • C#,码海拾贝(04)——拉格朗日(Lagrange)曲线插值算法及其拓展,《C#数值计算算法编程》源代码升级改进版
  • 解决使用WinScp连接Ubantu系统失败的问题---SSH无法连接
  • ChatGPT会干掉测试吗?
  • docker容器内的网络抓包
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • flutter的key在widget list的作用以及必要性
  • java中具有继承关系的类及其对象初始化顺序
  • Js基础知识(一) - 变量
  • Logstash 参考指南(目录)
  • SAP云平台里Global Account和Sub Account的关系
  • Spring Cloud Feign的两种使用姿势
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 闭包--闭包作用之保存(一)
  • 初识 webpack
  • 技术胖1-4季视频复习— (看视频笔记)
  • 人脸识别最新开发经验demo
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何编写一个可升级的智能合约
  • 使用Gradle第一次构建Java程序
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 一道闭包题引发的思考
  • 应用生命周期终极 DevOps 工具包
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .netcore如何运行环境安装到Linux服务器
  • .NET学习全景图
  • .net与java建立WebService再互相调用
  • .NET中的Exception处理(C#)
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [ai笔记4] 将AI工具场景化,应用于生活和工作
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用