首页 > 其他分享 >滚动照片抽奖软件

滚动照片抽奖软件

时间:2022-11-20 21:04:34浏览次数:55  
标签:originalImage 抽奖 滚动 缩略图 int System Width 软件 Math


1、女友说很丑的一个软件

说个最近的事情,女友公司过年了要搞活动,需要个抽奖的环节,当时就问我能不能给做一个,正好我也没啥事儿,就在周末的时候用C#做了一个,虽然派上用场了,不过被说丑也是挺无语的……

2、丑也要说

虽然心里想的这个软件很简单,但是真正编程也花了5个小时,主要在怎样做好看上犹豫的太久,后来索性全都做成可以配置的了,也真是绝了……

3、程序主界面

先把软件界面放出来:

主界面

滚动照片抽奖软件_控件

抽中某某某的样子

滚动照片抽奖软件_2d_02

使用帮助

滚动照片抽奖软件_软件_03

根本也没用什么随机之类的算法,直接用的是Timer控件,噼里啪啦一顿循环,按 “空格” 或者 “回车” 都可以 “开始/暂停”,简单暴力。抽中后,可以把抽中的人删除掉,双击照片,或者直接按键盘 “DEL”(随意大小写)就可以删掉这个人了,下次就不会重复出现了……当然,可以重置所有的列表,跟着使用帮助就可以了。

4、配置文件

界面控件位置(控件在运行期间是可以移动的,自动保存移动位置)

滚动照片抽奖软件_2d_04

软件配置

滚动照片抽奖软件_软件_05

配置文件的详细解释:

[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、主界面上的图片也是可以修改的

主界面图片源

滚动照片抽奖软件_控件_06

目录Images文件夹中的图片,是主界面显示的:背景、Logo以及空闲状态的照片,可以修改成自己想要的样子。

6、至于如何把照片放到程序里

想要滚动的照片,放到Box文件夹中,如果有文本要显示,取和图片相同文件名,后缀为.txt就可以了:

要滚动的照片放在这里

滚动照片抽奖软件_控件_07

对于一些大图片来说,动辄就是几M,也并不能让用户来压缩成小图片,所以我就自行处理成缩略图了,以免在程序中加载图片太大造成的卡顿,当然对于这个文件夹的操作 “什么都不用管,什么都不用管,什么都不用管”:

图片的缩略图处理

滚动照片抽奖软件_2d_08

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();
}
}
}


标签:originalImage,抽奖,滚动,缩略图,int,System,Width,软件,Math
From: https://blog.51cto.com/yuzhyn/5872027

相关文章

  • 在嵌入式软件中使用断言的一点想法
    嵌入式软件中的断言应该分成三个级别,而不是仅有启用和关闭两种。1、启用断言并打印可读信息;2、启用断言并打印代码地址、3、关闭断言。mingdu.zhengatgmaildotcom矛盾断......
  • 嵌入式软件异步编程:同步还是异步?
    异步并不总是提高效率的,那什么时候用同步,什么时候用异步呢?mingdu.zhengatgmaildotcom异步要解决的是CPU和I/O速度差异的问题,所以异步适合I/O远慢于CPU的情况,如果I/O仅稍......
  • 拓端数据tecdat:R语言代写CRAN软件包Meta分析
    我一直在寻找各种方法来查找有关R包的信息,但我最近才了解CRAN_package_db()了基本tools包中的函数。如果一位同事没有向我指出,我确信我永远不会自己找到它。 当被调用时,这......
  • Texpad for Mac(LaTeX编辑器Texifier软件)
    Texpad是一个LaTeX编辑软件,Texpad(现称为Texifier),Texpad在与LaTeX同等的基础上支持Markdown,专为任何规模的项目的直接导航、编辑和排版而设计,使用Texpad内置的Texpa......
  • 最完美WIN11_Pro_22H2.22622.898软件选装纯净版VIP37.5
    【系统简介】=============================================================1.本次更新母盘来UUP WIN11_Pro_22H2.22621.898,添加升级补丁至22622.898。2.不支持更新,更新......
  • 硬件测试与软件测试的一些区别
    硬件测试一般是硬件产品的测试,保证测试质量和顺利进行,参与硬件测试技术和规范的改进和制定。测试人员需要熟练使用万用表、示波器等各种基本测试仪器。软件测试是利用人工......
  • 第一章:第1章 CRM核心业务介绍--概述,crm架构,公司组织结构,软件开发的生命周期,crm项目的
    第一章:第1章CRM核心业务介绍1.什么是crm项目:1,CRM(CustomerRelationshipManagement)客户关系管理是管理企业与客户之间关系的新型管理机制。终极目标是吸引新客户、......
  • 如何删除奇安信软件
    1.事情的缘由之前待过一家公司,安装了360奇安信安全软件。由于更换了电脑,必须卸载奇安信,可是删除需要输入密码。后来联系了相关的人员,因为软件使用有点久远,没找到密码。......
  • 隐藏overflow滚动条(多兼容)
    外层套一个overflow:hiddenparentBoxwidth:318px;//这里为了隐藏y轴的滚动条(Ie)min-height:48px;display:flex;overflow:hidden;margin:18pxauto......
  • 软件工程师-用户意识
    停下来思考软件工程师成长过程中,学习编程语言、算法、设计模式、系统平台、软件库、工具等等,加上行业技术的快速发展,可谓是学无止境。面对无穷无尽的技术更新,很多软件工程......