c#图片各种处理旋转裁剪分辨率调整文档格式.docx

上传人:b****4 文档编号:16423660 上传时间:2022-11-23 格式:DOCX 页数:35 大小:25.65KB
下载 相关 举报
c#图片各种处理旋转裁剪分辨率调整文档格式.docx_第1页
第1页 / 共35页
c#图片各种处理旋转裁剪分辨率调整文档格式.docx_第2页
第2页 / 共35页
c#图片各种处理旋转裁剪分辨率调整文档格式.docx_第3页
第3页 / 共35页
c#图片各种处理旋转裁剪分辨率调整文档格式.docx_第4页
第4页 / 共35页
c#图片各种处理旋转裁剪分辨率调整文档格式.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

c#图片各种处理旋转裁剪分辨率调整文档格式.docx

《c#图片各种处理旋转裁剪分辨率调整文档格式.docx》由会员分享,可在线阅读,更多相关《c#图片各种处理旋转裁剪分辨率调整文档格式.docx(35页珍藏版)》请在冰豆网上搜索。

c#图片各种处理旋转裁剪分辨率调整文档格式.docx

newPoint(0,0),//destinationforupper-leftpointoforiginal

newPoint(100,0),//destinationforupper-rightpointoforiginal

newPoint(50,100)};

//destinationforlower-leftpointoforiginal

//图像截取:

Rectanglesr=newRectangle(80,60,400,400);

//要截取的矩形区域

Rectangledr=newRectangle(0,0,200,200);

//要显示到Form的矩形区域

g.DrawImage(bmp,dr,sr,GraphicsUnit.Pixel);

//改变图像大小:

intwidth=bmp.Width;

intheight=bmp.Height;

//改变图像大小使用低质量的模式

g.InterpolationMode=InterpolationMode.NearestNeighbor;

g.DrawImage(bmp,newRectangle(10,10,120,120),//sourcerectangle

newRectangle(0,0,width,height),//destinationrectangle

GraphicsUnit.Pixel);

//使用高质量模式

//g.CompositingQuality=CompositingQuality.HighSpeed;

g.InterpolationMode=InterpolationMode.HighQualityBicubic;

g.DrawImage(

bmp,

newRectangle(130,10,120,120),

newRectangle(0,0,width,height),

//设置图像的分辩率:

bmp.SetResolution(300f,300f);

g.DrawImage(bmp,0,0);

bmp.SetResolution(1200f,1200f);

g.DrawImage(bmp,180,0);

//用GDI+画图

GraphicsgForm=e.Graphics;

gForm.FillRectangle(Brushes.White,this.ClientRectangle);

for(inti=1;

i<

=7;

++i)

//在窗体上面画出橙色的矩形

Rectangler=newRectangle(i*40-15,0,15,

this.ClientRectangle.Height);

gForm.FillRectangle(Brushes.Orange,r);

//在内存中创建一个Bitmap并设置CompositingMode

Bitmapbmp=newBitmap(260,260,

System.Drawing.Imaging.PixelFormat.Format32bppArgb);

GraphicsgBmp=Graphics.FromImage(bmp);

gBmp.CompositingMode=System.Drawing.Drawing2D.CompositingMode.SourceCopy;

//创建一个带有Alpha的红色区域

//并将其画在内存的位图里面

Colorred=Color.FromArgb(0x60,0xff,0,0);

BrushredBrush=newSolidBrush(red);

gBmp.FillEllipse(redBrush,70,70,160,160);

//创建一个带有Alpha的绿色区域

Colorgreen=Color.FromArgb(0x40,0,0xff,0);

BrushgreenBrush=newSolidBrush(green);

gBmp.FillRectangle(greenBrush,10,10,140,140);

//在窗体上面画出位图nowdrawthebitmaponourwindow

gForm.DrawImage(bmp,20,20,bmp.Width,bmp.Height);

//清理资源

bmp.Dispose();

gBmp.Dispose();

redBrush.Dispose();

greenBrush.Dispose();

//在窗体上面绘图并显示图像

PenblackPen=newPen(Color.Black,1);

if(ClientRectangle.Height/10>

0)

for(inty=0;

y<

ClientRectangle.Height;

y+=ClientRectangle.Height/10)

g.DrawLine(blackPen,newPoint(0,0),newPoint(ClientRectangle.Width,y));

blackPen.Dispose();

C#使用Bitmap类进行图片裁剪

在Mapwin(手机游戏地图编辑器)生成的地图txt文件中添加自己需要处理的数据后转换成可在手机(Ophone)开发环境中使用的字节流地图文件的小工具,其中就涉及到图片的裁剪和生成了。

有以下几种方式。

方法一:

拷贝像素。

当然这种方法是最笨的,效率也就低了些。

在Bitmap类中我们可以看到这样两个方法:

GetPixel(intx,inty)和SetPixel(intx,inty,Colorcolor)方法。

从字面的含以上就知道前者是获取图像某点像素值,是用Color对象返回的;

后者是将已知像素描画到制定的位置。

下面就来做个实例检验下:

1.首先创建一个WindowsForm窗体程序,往该窗体上拖放7个PictureBox控件,第一个用于放置并显示原始的大图片,其后6个用于放置并显示裁剪后新生成的6个小图;

2.放置原始大图的PictureBox控件name属性命名为pictureBoxBmpRes,其后pictureBox1到pictureBox6依次命名,并放置在合适的位置;

3.双击Form窗体,然后在Form1_Load事件中加入下面的代码即可。

//导入图像资源

BitmapbmpRes=null;

StringstrPath=Application.ExecutablePath;

try{

intnEndIndex=strPath.LastIndexOf('

//'

strPath=strPath.Substring(0,nEndIndex)+"

//Bmp//BmpResMM.bmp"

;

bmpRes=newBitmap(strPath);

//窗体上显示加载图片

pictureBoxBmpRes.Width=bmpRes.Width;

pictureBoxBmpRes.Height=bmpRes.Height;

pictureBoxBmpRes.Image=bmpRes;

}

catch(Exceptionex)

{

System.Windows.Forms.MessageBox.Show("

图片资源加载失败!

/r/n"

+ex.ToString());

//裁剪图片(裁成2行3列的6张图片)

intnYClipNum=2,nXClipNum=3;

Bitmap[]bmpaClipBmpArr=newBitmap[nYClipNum*nXClipNum];

for(intnYClipNumIndex=0;

nYClipNumIndex<

nYClipNum;

nYClipNumIndex++)

for(intnXClipNumIndex=0;

nXClipNumIndex<

nXClipNum;

nXClipNumIndex++)

intnClipWidth=bmpRes.Width/nXClipNum;

intnClipHight=bmpRes.Height/nYClipNum;

intnBmpIndex=nXClipNumIndex+nYClipNumIndex*nYClipNum+(nYClipNumIndex>

0?

1:

0);

bmpaClipBmpArr[nBmpIndex]=newBitmap(nClipWidth,nClipHight);

for(intnY=0;

nY<

nClipHight;

nY++)

for(intnX=0;

nX<

nClipWidth;

nX++)

intnClipX=nX+nClipWidth*nXClipNumIndex;

intnClipY=nY+nClipHight*nYClipNumIndex;

ColorcClipPixel=bmpRes.GetPixel(nClipX,nClipY);

bmpaClipBmpArr[nBmpIndex].SetPixel(nX,nY,cClipPixel);

}

PictureBox[]picbShow=newPictureBox[nYClipNum*nXClipNum];

picbShow[0]=pictureBox1;

picbShow[1]=pictureBox2;

picbShow[2]=pictureBox3;

picbShow[3]=pictureBox4;

picbShow[4]=pictureBox5;

picbShow[5]=pictureBox6;

for(intnLoop=0;

nLoop<

nYClipNum*nXClipNum;

nLoop++)

picbShow[nLoop].Width=bmpRes.Width/nXClipNum;

picbShow[nLoop].Height=bmpRes.Height/nYClipNum;

picbShow[nLoop].Image=bmpaClipBmpArr[nLoop];

现在看看那些地方需要注意的了。

其中

intnBmpIndex=

nXClipNumIndex+nYClipNumIndex*nYClipNum+(nYClipNumIndex>

这句定义了存储裁剪图片对象在数组中的索引,需要注意的就是后面的(nYClipNumIndex>

0)——因为只有当裁剪的对象处于第一行以外的行时需要将索引加1;

另外,因为这种方法的效率不高,程序运行起来还是顿了下。

如果有兴趣的话,可以将以上的代码放到一个按钮Click事件函数中,当单击该按钮时就可以感觉到了。

方法二:

运用Clone函数局部复制。

同样在Bitmap中可以找到Clone()方法,该方法有三个重载方法。

Clone(),Clone(Rectangle,PixelFormat)和Clone(RectangleF,PixelFormat)。

第一个方法将创建并返回一个精确的实例对象,后两个就是我们这里需要用的局部裁剪了(其实后两个方法本人觉得用法上差不多)。

将上面的程序稍稍改进下——将裁剪的处理放到一个按钮事件函数中,然后再托一个按钮好窗体上,最后将下面的代码复制到该按钮的事件函数中。

for(intnYClipNumIndex=0;

intnBmpIndex=

0?

1:

0);

RectanglerClipRect=newRectangle(nClipWidth*nXClipNumIndex,

nClipHight*nYClipNumIndex,

nClipWidth,

nClipHight);

bmpaClipBmpArr[nBmpIndex]=bmpRes.Clone(rClipRect,bmpRes.PixelFormat);

运行程序,单击按钮检验下,发现速度明显快可很多。

其实这种方法较第一中方法不同的地方仅只是变换了for循环中的拷贝部分的处理,

RectanglerClipRect=newRectangle(nClipWidth*nXClipNumIndex,

bmpaClipBmpArr[nBmpIndex]=bmpRes.Clone(rClipRect,bmpRes.PixelFormat);

一.底片效果

原理:

GetPixel方法获得每一点像素的值,然后再使用SetPixel方法将取反后的颜色值设置到对应的点.

效果图:

代码实现:

privatevoidbutton1_Click(objectsender,EventArgse)

//以底片效果显示图像

try

intHeight=this.pictureBox1.Image.Height;

intWidth=this.pictureBox1.Image.Width;

Bitmapnewbitmap=newBitmap(Width,Height);

Bitmapoldbitmap=(Bitmap)this.pictureBox1.Image;

Colorpixel;

for(intx=1;

x<

Width;

x++)

for(inty=1;

Height;

y++)

intr,g,b;

pixel=oldbitmap.GetPixel(x,y);

r=255-pixel.R;

g=255-pixel.G;

b=255-pixel.B;

newbitmap.SetPixel(x,y,Color.FromArgb(r,g,b));

this.pictureBox1.Image=newbitmap;

catch(Exceptionex)

MessageBox.Show(ex.Message,"

信息提示"

MessageBoxButtons.OK,MessageBoxIcon.Information);

二.浮雕效果

对图像像素点的像素值分别与相邻像素点的像素值相减后加上128,然后将其作为新的像素点的值.

//以浮雕效果显示图像

BitmapnewBitmap=newBitmap(Width,Height);

BitmapoldBitmap=(Bitmap)this.pictureBox1.Image;

Colorpixel1,pixel2;

for(intx=0;

Width-1;

for(inty=0;

Height-1;

intr=0,g=0,b=0;

pixel1=oldBitmap.GetPixel(x,y);

pixel2=oldBitmap.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<

r=0;

if(g>

g=255;

if(g<

g=0;

if(b>

b=255;

if(b<

b=0;

newBitmap.SetPixel(x,y,Color.FromArgb(r,g,b));

this.pictureBox1.Image=newB

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1