计算机图形学(一):渲染一个渐变

这篇博客介绍了如何用C#编程实现一个800x600像素的位图,并通过SetPixel方法设置每个像素为随机颜色或指定的RGB颜色。接着,展示了如何使用SaveFileDialog控件保存图片到桌面。最后,通过ColorDialog控件实现了从上到下颜色渐变的效果,使图片顶部和底部呈现不同颜色,中间平滑过渡。
摘要由CSDN通过智能技术生成

首先新建一个Bitmap对象,bitmap分辨率为800 * 600.
代码如下:
新建一个Bitmap对象
设置分辨率
然后利用SetPixel方法,将图片中的所有像素设置为rgb颜色为(200,1,120)
代码如下:

int W = 800;
            int H = 600;
            bitmap = new Bitmap(W, H);//设置bitmap分辨率
            Color color =Color.FromArgb(200,1,120);
            for(int i=0;i<H;i++)
            {     
               /* int R =random();
                int G = random();
                int B = random();
                Color color = Color.FromArgb(R, G, B);*/
                for (int j=0;j<W;j++)
                {
                    
                    bitmap.SetPixel(j, i, color);//设置颜色
                }
            }
            picBox.BackgroundImage = bitmap;//显示图片

此时截图如下:
显示图片
第三步: 利用Save方法,以及SavefileDialog控件,将上述图片保存到桌面。
代码如下

在这里插入图片描述

此时显示如下:
显示到桌面
第四步:利用Random类,设置背景中的每行像素颜色为某一个随机颜色值。

代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace RayTracingWord
{
    public partial class Form1 : Form
    {
        Bitmap bitmap;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
        private int random()//重新设立一个randrom方法,不用Randrom类
        {
            var seed = Guid.NewGuid().GetHashCode();
            Random r = new Random(seed);
            int i = r.Next(0, 255);
            return i ;

        }
        private void emerge_Click(object sender, EventArgs e)
        {
            int W = 800;
            int H = 600;
            bitmap = new Bitmap(W, H);//设置bitmap分辨率
           // Color color1 =Color.FromArgb(200,1,120);
            for(int i=0;i<H;i++)
            {     
                int R =random();
                int G = random();
                int B = random();
                Color color = Color.FromArgb(R, G, B);
                for (int j=0;j<W;j++)
                {
                    
                    bitmap.SetPixel(j, i, color);//设置颜色
                }
            }
            picBox.BackgroundImage = bitmap;//显示图片
        }
     
        private void Save_Click(object sender, EventArgs e)
        {
            SaveFileDialog sfd = new SaveFileDialog();//保存图片实例化
            sfd.Filter = "jpg图片|*.jpg|Bmp图片|*.bmp|Png图片|*.png|Gif图片|*.gif";//设置保存图片格式
            sfd.RestoreDirectory = true;//再次打开是否固定到上次打开位置
            sfd.FileName = System.DateTime.Now.ToString("yyyyMMddHHmm") + "-";//设置图片默认名
            if(sfd.ShowDialog()==DialogResult.OK)
            {
                bitmap.Save(sfd.FileName);
                MessageBox.Show(this, "图片保存成功!", "信息提示");//保存成功提示窗口
            }
        }
    }
}

此时截图如下:
背景中的每行像素颜色为某一个随机颜色值

**最后:**通过ColorDialog控件,分别设置两个颜色,实现图片从顶部到底部的颜色渐变。既图片顶部为颜色1, 图片底部为颜色2。 图片中间实现颜色1到颜色2 的线性渐变。
代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace RayTracingWord
{
    public partial class Form1 : Form
    {
       
        int W = 800;
        int H = 600;
        Bitmap bitmap = new Bitmap(800, 600);// 设置bitmap分辨率;
    
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
        private int random()//重新设立一个randrom方法,不用Randrom类
        {
            var seed = Guid.NewGuid().GetHashCode();
            Random r = new Random(seed);
            int i = r.Next(0, 255);
            return i ;

        }
        private void emerge_Click(object sender, EventArgs e)
        {
           
                                      //  Color color =Color.FromArgb(200,1,120);

        
            for (int i=0;i<H;i++)
            {     
               int R =random();
                int G = random();
                int B = random();
                Color color = Color.FromArgb(R, G, B);
                for (int j=0;j<W;j++)
                {
                    
                    bitmap.SetPixel(j, i, color);//设置颜色
                }
            }
            picBox.BackgroundImage = bitmap;//显示图片
        }
     
        private void Save_Click(object sender, EventArgs e)
        {
            SaveFileDialog sfd = new SaveFileDialog();//保存图片实例化
            sfd.Filter = "jpg图片|*.jpg|Bmp图片|*.bmp|Png图片|*.png|Gif图片|*.gif";//设置保存图片格式
            sfd.RestoreDirectory = true;//再次打开是否固定到上次打开位置
            sfd.FileName = System.DateTime.Now.ToString("yyyyMMddHHmm") + "-";//设置图片默认名
            if(sfd.ShowDialog()==DialogResult.OK)
            {
                bitmap.Save(sfd.FileName);
                MessageBox.Show(this, "图片保存成功!", "信息提示");//保存成功提示窗口
            }
        }
        Color color1;
        Color color2;
        private void btnJianBian_Click(object sender, EventArgs e)
        {
            if(colorDialog1.ShowDialog()==DialogResult.OK)
            {
                color1 = color2;
                color2 = colorDialog1.Color;
                for (int i = 0; i < H; i++)
                {
                  
                    Color color = Color.FromArgb((int)(color1.R+i*(color2.R-color1.R)/(H*1.0)), (int)(color1.G + i * (color2.G - color1.G) / (H * 1.0)), (int)(color1.B + i * (color2.B - color1.B) / (H * 1.0)));
                    for (int j = 0; j < W; j++)
                    {

                        bitmap.SetPixel(j, i, color);//设置颜色
                    }
                }
                picBox.BackgroundImage = bitmap;//显示图片
                picBox.Invalidate();
            }
        }
    }
}

此时截图如下:

在这里插入图片描述

写博客的初心也是为了记录自己的学习过程,有什么问题也希望大家可以在评论区留言,一起讨论。(。・`ω´・)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值