图像编辑器_课程设计报告-1
![图像编辑器_课程设计报告-1](https://img.360docs.net/img17/12q8sei63jvjtdei3jwkmamiw823ubfp-71.webp)
![图像编辑器_课程设计报告-1](https://img.360docs.net/img17/12q8sei63jvjtdei3jwkmamiw823ubfp-52.webp)
2016-2017学年第一学期
《Windows程序设计》
课程设计报告
题目:图像编辑器
专业:
班级:
姓名:
指导教师:
成绩:
学院
二0一六年十一月十五日
目录
1 设计内容及要求 (1)
1.1设计内容 (1)
1.2设计任务及具体要求 (1)
2 需求分析与功能简介 (2)
2.1 需求分析 (2)
2.2该软件的功能简介 (3)
2.3开发与运行环境 (3)
3 窗体界面分析 (4)
3.1控件功能介绍 (4)
3.2控件属性介绍 (5)
4 关键代码分析 (6)
4.1引用集和定义 (6)
4.2打开图片 (6)
4.3保存图片 (7)
4.4退出 (7)
4.5打印 (8)
4.6 图片调整(以亮度为例) (9)
4.7 图片特效处理(浮雕、负片、黑白、柔化) (10)
5 成果展示 (15)
5.1 图片的打开与保存 (15)
5.2 图片调整 (16)
5.3 图片特效处理 (17)
5.4 图片浏览(单击右下箭头) (19)
6 小结 (20)
7参考文献 (21)
1 设计内容及要求
1.1设计内容
《图像编辑器》主要根据本次课程设计要求进行设计。
当下市场有许多图片编辑软件,比如Adobe Photoshop、Fireworks等,它们的功能都十分强大但是在使用的时候我们却必须花费许多时间去学习去掌握这些软件的使用方法。而且往往越是功能强大的软件,使用起来就越复杂——这是一个很现实的规律。
很多时候我们也许只是需要简单地对图片进行些微处理和浏览,当今社会“效率”无疑是许多人追求的目标,特别是对小孩、老人或者不太了解计算机知识的人,我们想要的效果无非是“所见即所得”。这意味着简洁明了的操作界面和通俗易懂的操作方式将会是他们的首选。
以这种理念设计的这款图像编辑器,极大程度上地简化了操作,具化了效果,实现了高效率的工作空间。
该图像编辑器功能主要包括三部分:
1)对图片的查看与浏览。
2)对图片进行外观调整。
3)对图片进行特效编辑。
1.2设计任务及具体要求
在面对《图像编辑器》的设计时,我们首先要考虑的是这个图像编辑器的功能设计,然后再考虑外观,例如按键和界面的设计等。
第一步是制作计划。
首先从功能方面出发,我计划的图像编辑器应该由主窗口衍生并具有三个模块:导入模块、处理模块和输出模块。分别控制图像的打开,编辑和保存等;三个模块分别再由其各自的组成功能构成。例如从文件夹中查找并获取图像文件、改变图片的亮度、改变图片的特殊效果、保存图片为指定格式等。
然后外观方面,将在功能都实现之后,结合使用感受来进行设计。
我将设计任务整理成一张计划图,树状分支清晰地展示了这个图像编辑器的
各部分功能。这将成为设计的初步要求,之后的代码设计将依据这张计划图施行。后期再根据实际情况进行改进,比如说运行中出现的问题等。
图1 初期设计任务计划图
由图1展示的计划图所示,我将先从窗体设计开始,规划功能分区。再写代码构建实现这些功能,根据实际使用感受来适当修改。结合之前所学的有关C#的知识来实现这个图像编辑器的设计。
2 需求分析与功能简介
2.1 需求分析
这个图片编辑器将会是一个简单并且实用的简易图片编辑的工具,不但可以实现改变图片亮度和图片的特殊效果等功能,而且还能进行对图片的一些简单查看,浏览操作。应该可以满足大部分用户的使用需求。
本软件不但界面友好,功能齐全,而且操作简单。是一款容易操作,实用的图片管理软件。也是一款比较适合广大普通用户和不熟悉计算机的用户的图片查看编辑软件。
我们从用户角度,把软件功能的实现变得简单,易于操作。
对于一个简单的软件来说,首要的就是要能流畅地运行其应有的功能。其次,界面的外观也要满足用户的审美需求。
我们了解现在常用的图片编辑软件Adobe Photoshop, Fireworks的优势和不足,我们做的小软件虽然不能跟这些大公司的软件媲美,但是我们也有自己的特点,它操作简便,界面清新,又能实现用户所需要的功能。
在这款软件中我们可以打开浏览图片,还可以改变图片的亮度或者以浮雕、反色、柔化等各种效果来对图片进行更改。也可以保存打印做好效果的图片。这个软件还可以开发出一些对图片进行大小、方向调整的小功能,可谓是“麻雀虽小五脏俱全”。
2.2该软件的功能简介
1)图片的打开与查看;
2)对图片进行亮度、对比度调整;
3)对图片进行特效编辑;
(浮雕、反色、黑白、柔化效果)
4)图片的浏览;
5)图片的保存与打印。
通过简单的按钮操作即可实现功能。除去编辑和浏览,还具有保存打印的功能,多方面满足人们的需求。
2.3开发与运行环境
该图片编辑器的开发与运行环境如下:
开发环境:Windows 7
开发工具:Microsoft Visual studio 2013( C#)
硬件环境: CPU:2.40GHz 双核、内存:4G、硬盘:320G
运行环境:Windows XP/7/8
3 窗体界面分析
图2 窗体设计图
由图2可见,窗体界面包括“打开图片”、“保存图片”、“退出”和“打印”四个菜单栏选项,亮度调整、对比度调整和特殊效果等单独处理按钮,灰色区域则为图片处理效果显示区。
表1 各控件属性表
3.1控件功能介绍
由表1所示,首先在窗体中插入一个PictureBox,用来实现图片的显示。
在PictureBox控件的属性中选择paint的事件。
用四个ToolStripMenuItem控件分别来实现打开图片、保存图片、退出和打印的功能,并都通过click操作来完成。
用三个Label控件来表示亮度、对比度和特殊效果的提示文字。
再用一个Label控件来表示左下提醒文字。
用八个Button控件分别来实现增加亮度、降低亮度、增加对比度、降低对比度、浮雕效果、反色效果、黑白效果和柔化效果的功能,并都通过click操作来完成功能。
用一个Button控件(SAFE)来实现另一种保存方法。
用一个Button控件(>>)来实现图片的浏览。
3.2控件属性介绍
整个Form窗体的Background Image换成想要的图片。
PictureBox控件的属性中选择paint的事件。
Button的Back Color都设为Button Face样式。
Label和Button都更改Text属性为想要的文字。
图3 控件属性设置
4 关键代码分析
4.1引用集和定义
using System;
using System.Collections.Generic;
using https://www.360docs.net/doc/198890499.html,ponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private Bitmap m_bitmap = null;
public Form1()
{
InitializeComponent();
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
if (m_bitmap != null)
{
Graphics gra = e.Graphics;
gra.DrawImage(m_bitmap, new Rectangle
(this.AutoScrollPosition.X, this.AutoScrollPosition.Y,
(int)(m_bitmap.Width), (int)(m_bitmap.Height)));
}
}
引用集、定义与声明,确立类型。
4.2打开图片
private void打开图片ToolStripMenuItem_Click_1(object sender, EventArgs e) {
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "bitmap文件(*.bmp)|*.bmp|Jpeg文件(*.jpg)|*.jpg|所有适合文件(*.bmp/*.jpg)|*.bmp/*.jpg";
openFileDialog.FilterIndex = 2;
openFileDialog.RestoreDirectory = true;
if (DialogResult.OK == openFileDialog.ShowDialog())
{
m_bitmap = (Bitmap)Bitmap.FromFile(openFileDialog.FileName, false);
this.AutoScroll = true;
this.AutoScrollMinSize = new Size((int)(m_bitmap.Width),
(int)(m_bitmap.Height));
this.Invalidate();
}
}
双击打开图片ToolStripMenuItem进入代码编辑,书写代码读取指定格式的图像文件并打开文件在PictureBox中显示。(这里只选取了一部分文件类型)
4.3保存图片
private void保存图片ToolStripMenuItem_Click(object sender, EventArgs e)
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "bitmap文件(*.bmps)|*.bmp|Jpeg文件(*.jpg)|*.jpg|PNG 文件(*.png)|*.png|所有适合文件(*.bmp/*.jpg)|*.bmp/*.jpg";
saveFileDialog.FilterIndex = 1;
saveFileDialog.RestoreDirectory = true;
if (DialogResult.OK == saveFileDialog.ShowDialog())
{
m_bitmap.Save(saveFileDialog.FileName);
}
}
使用SaveFileDialog,选择路径和格式保存文件。
4.4退出
private void退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
}
点击退出完成退出窗口功能。
4.5打印
private void打印ToolStripMenu_Click(object sender, EventArgs e)
{
printPreviewDialog1.Document = printDocument1;
printPreviewDialog1.showDialog();
}
private void printDocument1_PrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
{
int printWidth = printDocument1.DefaultPageSetting.PaperSize.Width;//打印纸张的宽度和高度
int printHeight = printDocument1.DefaultPageSetting.PaperSize.Height;
if (Convert.ToInt32(picturewidth) <= printWidth) ;//如果图片的宽度小于纸张的宽度则显示在中间
{
float x = (printWidth - Convert.ToInt32(picturewidth)) / 2;
float y = (printHeight - Convert.ToInt32(pictureheight)) / 2;
e.Graphics.DrawImage(Image.FromFile(fpath), x, y,
Convert.ToInt32(picturewidth), Convert.ToInt32(pictureheight));
}
else
{
if(Convert.ToInt32(picturewidth)>Convert.ToInt32(pictureheight))
{
Bitmap bitmap= (Bitmap)Bitmap.FromFile(fpath);
bitmap.RotateFlip(RotateFlipType.Rotate90FlipXY);
PictureBox pb=new PictureBox();
pb.Image=bitmap;
Single a=printWidth/Convert.ToSingle(pictureheight);
e.Graphics.DrawImage(pb.Image,0,0,Convert.ToSingle(pictureheight)*a,Convert.ToSingle(pi cturewidth)*a);
}
else
{
Single a=printWidth/Convert.ToSingle(pictureheight);
e.Graphics.DrawImage(pb.Image,0,0,Convert.ToSingle(pictureheight)*a,Convert.ToSingle(pi cturewidth)*a);
}
}
}
打印图片的设置,考虑图片的大小问题设置打印数值。
4.6 图片调整(以亮度为例)
private void button1_Click(object sender, EventArgs e)
{
int percent = 50;
Single v = 0.006F * percent;
Single[][] matrix = {
new Single[] { 1, 0, 0, 0, 0 },
new Single[] { 0, 1, 0, 0, 0 },
new Single[] { 0, 0, 1, 0, 0 },
new Single[] { 0, 0, 0, 1, 0 },
new Single[] { v, v, v, 0, 1 }
};
System.Drawing.Imaging.ColorMatrix cm = new
System.Drawing.Imaging.ColorMatrix(matrix);
System.Drawing.Imaging.ImageAttributes attr = new
System.Drawing.Imaging.ImageAttributes();
attr.SetColorMatrix(cm);
//Image tmp
Image tmp = m_bitmap;
this.pictureBox1.Image = m_bitmap;
Graphics g = Graphics.FromImage(tmp);
try
{
Rectangle destRect = new Rectangle(0, 0, tmp.Width, tmp.Height);
g.DrawImage(tmp, destRect, 0, 0, tmp.Width, tmp.Height, GraphicsUnit.Pixel, attr);
}
finally
{
g.Dispose();
}
this.pictureBox1.Image = (Image)tmp.Clone();
}
亮度增强,C#中可以通过调整每个像素的颜色值来改变图片的整体亮度,我通过更改每个像素的数值来实现亮度增强。C#中也有可以控制这一功能的类。
private void button2_Click(object sender, EventArgs e)
{
int percent = 50;
Single v = -0.006F * percent;
Single[][] matrix = {
new Single[] { 1, 0, 0, 0, 0 },
new Single[] { 0, 1, 0, 0, 0 },
new Single[] { 0, 0, 1, 0, 0 },
new Single[] { 0, 0, 0, 1, 0 },
new Single[] { v, v, v, 0, 1 }
};
System.Drawing.Imaging.ColorMatrix cm = new
System.Drawing.Imaging.ColorMatrix(matrix);
System.Drawing.Imaging.ImageAttributes attr = new
System.Drawing.Imaging.ImageAttributes();
attr.SetColorMatrix(cm);
//Image tmp
Image tmp = m_bitmap;
this.pictureBox1.Image = m_bitmap;
Graphics g = Graphics.FromImage(tmp);
try
{
Rectangle destRect = new Rectangle(0, 0, tmp.Width, tmp.Height);
g.DrawImage(tmp, destRect, 0, 0, tmp.Width, tmp.Height, GraphicsUnit.Pixel, attr);
}
finally
{
g.Dispose();
}
this.pictureBox1.Image = (Image)tmp.Clone();
}
亮度降低也是同样的道理,只不过将像素调整改为负值(即降低)而已。
4.7 图片特效处理(浮雕、负片、黑白、柔化)
private void button5_Click(object sender, EventArgs e)
{
//以浮雕效果显示图像
Image tmp = m_bitmap;
this.pictureBox1.Image = m_bitmap;
Graphics g = Graphics.FromImage(tmp);
try
{
int Height = this.pictureBox1.Image.Height;
int Width = this.pictureBox1.Image.Width;
Color pixel1, pixel2;
for (int x = 0; x < Width - 1; x++)
{
for (int y = 0; y < Height - 1; y++)
{
int R = 0, G = 0, B = 0;
pixel1 = m_bitmap.GetPixel(x, y);
pixel2 = m_bitmap.GetPixel(x + 1, y + 1);
R = Math.Abs(pixel1.R - pixel2.R + 128);
G = Math.Abs(pixel1.G - pixel2.G + 128);
B = Math.Abs(pixel1.B - pixel2.B + 128);
if (R > 255)
R = 255;
if (R < 0)
R = 0;
if (G > 255)
G = 255;
if (G < 0)
G = 0;
if (B > 255)
B = 255;
if (B < 0)
B = 0;
m_bitmap.SetPixel(x, y, Color.FromArgb(R, G, B));
}
}
this.pictureBox1.Image =m_bitmap;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "信息提示", MessageBoxButtons.OK, https://www.360docs.net/doc/198890499.html,rmation);
}
}
改变图片为浮雕效果,原理是对图像像素点的像素值分别与相邻像素点的像素值相减后加上128,然后将其作为新的像素点的值。仍然是对每个像素点的数值改变,用来实现类似浮雕的效果。
private void button6_Click(object sender, EventArgs e)
{
//以反色效果显示图像
Image tmp = m_bitmap;
this.pictureBox1.Image = m_bitmap;
Graphics g = Graphics.FromImage(tmp);
try
{
int Height = this.pictureBox1.Image.Height;
int Width = this.pictureBox1.Image.Width;
Color pixel;
for (int x = 1; x < Width; x++)
{
for (int y = 1; y < Height; y++)
{
int R, G, B;
pixel = m_bitmap.GetPixel(x, y);
R = 255 - pixel.R;
G = 255 - pixel.G;
B = 255 - pixel.B;
m_bitmap.SetPixel(x, y, Color.FromArgb(R, G, B));
}
}
this.pictureBox1.Image = m_bitmap;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "信息提示", MessageBoxButtons.OK, https://www.360docs.net/doc/198890499.html,rmation);
}
}
负片效果的原理是用Get Pixel方法获得每一点像素的值,然后再使用Set Pixel方法将取反后的颜色值设置到对应的点。这样既可实现图片的负片效果。
private void button7_Click(object sender, EventArgs e)
{
//以黑白效果显示图像
Image tmp = m_bitmap;
this.pictureBox1.Image = m_bitmap;
Graphics g = Graphics.FromImage(tmp);
try
{
int Height = this.pictureBox1.Image.Height;
int Width = this.pictureBox1.Image.Width;
Color pixel;
for (int x = 0; x < Width; x++)
for (int y = 0; y < Height; y++)
{
pixel = m_bitmap.GetPixel(x, y);
int R, G, B, Result = 0;
R = pixel.R;
G = pixel.G;
B = pixel.B;
//实例程序以加权平均值法产生黑白图像
int iType = 2;
switch (iType)
{
case 0://平均值法
Result = ((R + G + B) / 3);
break;
case 1://最大值法
Result =R > G ? R : G;
Result = Result >B ? Result : B;
break;
case 2://加权平均值法
Result = ((int)(0.7 *R) + (int)(0.2 * G) + (int)(0.1 * B));
break;
}
m_bitmap.SetPixel(x, y, Color.FromArgb(Result, Result, Result)); }
this.pictureBox1.Image = m_bitmap;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "信息提示");
}
}
黑白效果的产生方法有三种:①平均法:使每个像素点的RGB值等于原像素点的RGB平均值;②最大值法:使每个像素点的RGB值等于原像素点的RGB值最大的一个;③加权平均值法:对每个像素点RGB值加权平均求值;本实例程序中以加权平均值法来实现图片的黑白效果。
private void button8_Click(object sender, EventArgs e)
{
//以柔化效果显示图像
Image tmp = m_bitmap;
this.pictureBox1.Image = m_bitmap;
Graphics g = Graphics.FromImage(tmp);
try
{
int Height = this.pictureBox1.Image.Height;
int Width = this.pictureBox1.Image.Width;
Color pixel;
//高斯模板
int[] Gauss = { 1, 2, 1, 2, 4, 2, 1, 2, 1 };
for (int x = 1; x < Width - 1; x++)
for (int y = 1; y < Height - 1; y++)
{
int R = 0, G = 0, B = 0;
int Index = 0;
for (int col = -1; col <= 1; col++)
for (int row = -1; row <= 1; row++)
{
pixel = m_bitmap.GetPixel(x + row, y + col);
R += pixel.R * Gauss[Index];
G += pixel.G * Gauss[Index];
B += pixel.B * Gauss[Index];
Index++;
}
R /= 16;
G /= 16;
B /= 16; //处理颜色值溢出
R = R > 255 ? 255 : R;
R = R < 0 ? 0 : R;
G = G > 255 ? 255 :G;
G = G < 0 ? 0 : G;
B = B > 255 ? 255 : B;
B = B < 0 ? 0 : B;
m_bitmap.SetPixel(x - 1, y - 1, Color.FromArgb(R, G, B));
}
this.pictureBox1.Image = m_bitmap;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "信息提示");
}
}
柔化效果的原理是在当前像素点与周围像素点的颜色差距较大时取平均值,期间减少RGB值处理颜色溢出,从而产生图片的柔化效果。
5 成果展示
5.1 图片的打开与保存
图4 图片的打开
图5 图片的保存
5.2 图片调整
图6 打开后的原图
图7 图片增加亮度
由图6图7的对比可以看出,原图的亮度明显增加了。如果多次点击“增加亮度”选项的话,可以不断增加图片的亮度。
图8 图片降低亮度
由图6图8的对比可以看出,原图的亮度明显降低了。和“增加亮度”相似,如果多次点击“降低亮度”选项的话,也可以不断降低图片的亮度。
5.3 图片特效处理
图9 图片浮雕效果
由图9可以看出,“浮雕效果”选项使图片呈现出具有立体感的浮雕特效。
图10 图片负片效果
由图10可以看出,“负片效果”选项使图片呈现出负片效果,也就是平时用普通相机拍照冲洗出的底片效果。其明暗色彩与原图相反。
图11 图片黑白效果
由图11可以看出,“黑白效果”选项将彩色图片变成黑白图片,可以呈现出老照片的效果。