c# form求一个图像旋转90°的算法

c# form求一个图像旋转90°的算法,第1张

这么写就行了,不过GetPixel,SetPixel这种算法很耗时,建议你还是用指针

//顺时针

private void button1_Click(object sender, EventArgs e)

{

Bitmap bitmap1 = (Bitmap)pictureBox2.Image

Bitmap bitmap2 = new Bitmap(pictureBox2.Height, pictureBox2.Width)

for (int i = 0i <bitmap1.Widthi++)

{

for (int j = 0j <bitmap1.Heightj++)

{

Color color = bitmap1.GetPixel(i, j)

bitmap2.SetPixel(bitmap2.Width - j - 1, bitmap2.Height - i - 1, color)

}

}

pictureBox3.Image = bitmap2

}

//逆时针

private void button2_Click(object sender, EventArgs e)

{

Bitmap bitmap1 = (Bitmap)pictureBox2.Image

Bitmap bitmap2 = new Bitmap(pictureBox2.Height, pictureBox2.Width)

for (int i = 0i <bitmap1.Widthi++)

{

for (int j = 0j <bitmap1.Heightj++)

{

Color color = bitmap1.GetPixel(i, j)

bitmap2.SetPixel(j, i, color)

}

}

pictureBox3.Image = bitmap2

}

计算时调用:

Form3 frm=new Form3()

在Form3的窗口初始化事件中加入如下形式的代码:

TextBox3=Calculate(input1,input2)

就好了。

你说的太抽象,我只能给出一个大致的形式。

可以考虑使用全局变量嘛。

制作异形窗体或控件的思路一般都是想办法生成一个region,然后设置给指定的窗口或控件。生成region的方法有很多,最常用的就是从一幅图片生成,把该图片中的透明色部分“抠”掉,剩下的部分作为一个region。设置窗口或控件的region可以用setwindowrgn api,不过.net framework封装了这个 *** 作,在c#中只要对窗口或控件的region属性赋值就可以了。下面我就把我在c#中实现异形窗体的核心代码贴出来给大家看看,有什么意见尽管提,别客气哦j

首先,是一个根据bitmap对象生成region的方法:

/// <summary>

/// 取得一个图片中非透明色部分的区域。

/// </summary>

/// <param name="picture">取其区域的图片。</param>

/// <param name="transparentcolor">透明色。</param>

/// <returns>图片中非透明色部分的区域</returns>

private region bmprgn(bitmap picture, color transparentcolor)

{

int nwidth = picture.width

int nheight = picture.height

region rgn = new region()

rgn.makeempty()

bool istransrgn//前一个点是否在透明区

color curcolor//当前点的颜色

rectangle currect = new rectangle()

currect.height = 1

int x = 0, y = 0

//逐像素扫描这个图片,找出非透明色部分区域并合并起来。

for(y = 0y <nheight++y)

{

istransrgn = true

for (x = 0x <nwidth++x)

{

curcolor = picture.getpixel(x,y)

if(curcolor == transparentcolor || x == nwidth - 1)//如果遇到透明色或行尾

{

if(istransrgn == false)//退出有效区

{

currect.width = x - currect.x

rgn.union(currect)

}

}

else//非透明色

{

if(istransrgn == true)//进入有效区

{

currect.x = x

currect.y = y

}

}//if curcolor

istransrgn = curcolor == transparentcolor

}//for x

}//for y

return rgn

}

原理很简单,就是对该图片逐行扫描,在每一行中把那些非透明色的矩形(只有一个像素高)合并(union)到一个region对象中,当扫描完整个图片,得到的也就是我们想要的region了。这种算法在很多文章里都有介绍的。

有了region,下面就简单了:

this.region = bmprgn(new bitmap("d:\\a.bmp"), color.fromargb(0, 0, 0))

上面的代码就是把d:\a.bmp的轮廓作为主窗口的region的,假设该图片的背景黑色(color.fromargb(0, 0, 0))。

其实不光是form,任何控件都可以用这个方法设置region,制作出异形控件。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11748605.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-18
下一篇2023-05-18

发表评论

登录后才能评论

评论列表(0条)

    保存