滚动照片抽奖软件
来源:互联网 发布:c语言数组变成字符串 编辑:程序博客网 时间:2024/05/01 11:34
1、女友说很丑的一个软件
说个最近的事情,女友公司过年了要搞活动,需要个抽奖的环节,当时就问我能不能给做一个,正好我也没啥事儿,就在周末的时候用C#做了一个,虽然派上用场了,不过被说丑也是挺无语的……
2、丑也要说
虽然心里想的这个软件很简单,但是真正编程也花了5个小时,主要在怎样做好看上犹豫的太久,后来索性全都做成可以配置的了,也真是绝了……
3、程序主界面
先把软件界面放出来:
主界面
抽中某某某的样子
使用帮助
根本也没用什么随机之类的算法,直接用的是Timer控件,噼里啪啦一顿循环,按 “空格” 或者 “回车” 都可以 “开始/暂停”,简单暴力。抽中后,可以把抽中的人删除掉,双击照片,或者直接按键盘 “DEL”(随意大小写)就可以删掉这个人了,下次就不会重复出现了……当然,可以重置所有的列表,跟着使用帮助就可以了。
4、配置文件
界面控件位置(控件在运行期间是可以移动的,自动保存移动位置)
软件配置
配置文件的详细解释:
[Strings]FormName=这真的是一个抽奖软件 '窗口名'Title=这真的是一个抽奖软件 '标题文本'[Color]MottoText=#ffffff '段落文本的颜色'TitleText=#ffffff '标题的颜色'[FontStyle]Motto=华文楷体 '段落文本的字体'Title=华文楷体 '标题的字体'[FontSize]Title=20 '标题的字号'Motto=12 '段落文本的字号'[FormSize]MainFormWidth=1000 '窗口宽'MainFormHeight=600 '窗口高'[Interval]Rolling=50 '图片滚动间隔:毫秒'
5、主界面上的图片也是可以修改的
主界面图片源
目录Images文件夹中的图片,是主界面显示的:背景、Logo以及空闲状态的照片,可以修改成自己想要的样子。
6、至于如何把照片放到程序里
想要滚动的照片,放到Box文件夹中,如果有文本要显示,取和图片相同文件名,后缀为.txt就可以了:
要滚动的照片放在这里
对于一些大图片来说,动辄就是几M,也并不能让用户来压缩成小图片,所以我就自行处理成缩略图了,以免在程序中加载图片太大造成的卡顿,当然对于这个文件夹的操作 “什么都不用管,什么都不用管,什么都不用管”:
图片的缩略图处理
7、关于绘图过程的双缓冲
在拖动控件的时候或者绘图的过程中,会有些闪动的情况发生,需要在窗体构造的时候开启双缓冲即可:
SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景. SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲
8、关于缩略图的生成
之前忘了是从哪里收集的一个图片处理的工具类:
public class ImageHelper { /// <summary> /// 生成缩略图 /// </summary> /// <param name="originalImagePath">源图路径(物理路径)</param> /// <param name="thumbnailPath">缩略图路径(物理路径)</param> /// <param name="width">缩略图宽度</param> /// <param name="height">缩略图高度</param> /// <param name="mode">生成缩略图的方式</param> public static bool MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode) { Image originalImage = Image.FromFile(originalImagePath); int towidth = width; int toheight = height; int x = 0; int y = 0; int ow = originalImage.Width; int oh = originalImage.Height; switch (mode) { case "HW"://指定高宽缩放(可能变形) break; case "W"://指定宽,高按比例 toheight = originalImage.Height * width / originalImage.Width; break; case "H"://指定高,宽按比例 towidth = originalImage.Width * height / originalImage.Height; break; case "Cut"://指定高宽裁减(不变形) if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight) { oh = originalImage.Height; ow = originalImage.Height * towidth / toheight; y = 0; x = (originalImage.Width - ow) / 2; } else { ow = originalImage.Width; oh = originalImage.Width * height / towidth; x = 0; y = (originalImage.Height - oh) / 2; } break; default: break; } //新建一个bmp图片 Image bitmap = new System.Drawing.Bitmap(towidth, toheight); //新建一个画板 Graphics g = System.Drawing.Graphics.FromImage(bitmap); //设置高质量插值法 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; //设置高质量,低速度呈现平滑程度 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; //清空画布并以透明背景色填充 g.Clear(Color.Transparent); //在指定位置并且按指定大小绘制原图片的指定部分 g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight), new Rectangle(x, y, ow, oh), GraphicsUnit.Pixel); try { //以jpg格式保存缩略图 bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg); return true; } catch (System.Exception e) { return false; //throw e; } finally { originalImage.Dispose(); bitmap.Dispose(); g.Dispose(); } } /// <summary> /// 逆时针旋转图像 /// </summary> /// <param name="originalImagePath">原始图像路径</param> /// <param name="saveImagePath">保存图像的路径</param> /// <param name = "angle" > 旋转角度[0, 360](前台给的) </ param > /// <returns></returns> public static bool RotateImg(string originalImagePath, string saveImagePath, int angle) { Image originalImage = Image.FromFile(originalImagePath); angle = angle % 360; //弧度转换 double radian = angle * Math.PI / 180.0; double cos = Math.Cos(radian); double sin = Math.Sin(radian); //原图的宽和高 int w = originalImage.Width; int h = originalImage.Height; int W = (int)(Math.Max(Math.Abs(w * cos - h * sin), Math.Abs(w * cos + h * sin))); int H = (int)(Math.Max(Math.Abs(w * sin - h * cos), Math.Abs(w * sin + h * cos))); //目标位图 Bitmap saveImage = new Bitmap(W, H); Graphics g = Graphics.FromImage(saveImage); g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Bilinear; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; //计算偏移量 Point Offset = new Point((W - w) / 2, (H - h) / 2); //构造图像显示区域:让图像的中心与窗口的中心点一致 Rectangle rect = new Rectangle(Offset.X, Offset.Y, w, h); Point center = new Point(rect.X + rect.Width / 2, rect.Y + rect.Height / 2); g.TranslateTransform(center.X, center.Y); g.RotateTransform(360 - angle); //恢复图像在水平和垂直方向的平移 g.TranslateTransform(-center.X, -center.Y); g.DrawImage(originalImage, rect); //重至绘图的所有变换 g.ResetTransform(); g.Save(); //保存旋转后的图片 originalImage.Dispose(); try { saveImage.Save(saveImagePath, System.Drawing.Imaging.ImageFormat.Jpeg); return true; } catch (Exception e) { return false; } finally { originalImage.Dispose(); saveImage.Dispose(); g.Dispose(); } } }
附
GitHub 源码
0 0
- 滚动照片抽奖软件
- 抽奖软件
- 照片滚动
- 年会抽奖 抽奖软件 抽奖系统
- 滚动抽奖游戏实践
- 微博抽奖软件
- 随机抽奖软件
- java 抽奖软件
- 抽奖软件webapi开发
- 数字滚动抽奖的代码
- 手机号码滚动抽奖系统(JS)
- Android 滚动抽奖的实现
- 用Excel制作抽奖软件
- 简单抽奖软件java程序设计
- 最好用的抽奖软件
- J辉摇号摇奖抽奖软件
- 简易抽奖软件逻辑实现
- 实现按身份证滚动抽奖的程序
- jsp 页面编码优先级
- splay 模板
- 多线程基础
- 06-1-linux下寻求帮助
- 高速PCB设计中的阻抗匹配
- 滚动照片抽奖软件
- leetcode---Different Ways to Add Parentheses
- jenkins+ant+jmeter接口自动化的持续集成测试框架
- 关于下载
- 【JZOJ4965】【GDKOI2017模拟1.21】Equation
- SELinux阻止某些程序运行的处理方法
- 06-2-文件相关命令初步
- java中的 FileWriter类 和 FileReader类的一些基本用法
- WC集训总结