C#圖片縮放平移從功能分析到編碼實現(xiàn)_第1頁
C#圖片縮放平移從功能分析到編碼實現(xiàn)_第2頁
C#圖片縮放平移從功能分析到編碼實現(xiàn)_第3頁
C#圖片縮放平移從功能分析到編碼實現(xiàn)_第4頁
C#圖片縮放平移從功能分析到編碼實現(xiàn)_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

C#圖片縮放平移從功能分析到編碼實現(xiàn)一直都是在看別人的博客,查到想要的,看完后把頁面一關就萬事大吉了,沒啥感覺;直到后來遇到了同樣的問題,總想不起來咋弄,關鍵是還查不到以前看過的,郁悶!現(xiàn)在想想,還是“好記性不如爛筆頭”啊,自己弄過的東西總要留下的什么呀,不然你都不知道自己曾經多么優(yōu)秀。注冊博客園也好久了,因為不知道該寫點啥,再加上懶,一直沒有去管它,今日有空,正好開張!1.需求說明這個沒啥好說的,主要干三個事,用電腦的照片查看器打開一張你寶貝的自拍照。(1)拉動顯示窗口,圖片按照原有比例被放大和縮小,照片查看器中當圖片沒能完全顯示時,拉框時只是拉框,我們不管這個,只要圖片顯示窗口變了,那就按照原有比例被放大和縮小。(2)鼠標放在圖片的有效區(qū)域,鼠標滾輪放大和縮小圖片,縮小時最小只能到圖片原大??;放大無限制,照片查看器放大也有限制,咱也不管它。(3)鼠標放在圖片的有效區(qū)域,按住鼠標左鍵平移圖片,平移時只能平移圖片有效范圍。2.功能分析想想上面要實現(xiàn)的功能,結合C#,我們用Winform的窗體程序來實現(xiàn),圖片顯示用PictureBox控件,它有一個PictureBoxSizeMode屬性,值改成Zoom,這樣就能保證PictureBox控件里面的圖片隨PictureBox控件大小改變而按照原有比例縮放,然后把PictureBox控件放大Form窗體中,dock屬性改成Fill填滿就可以了,但dock屬性改成Fill填滿之后,PictureBox控件的大小變得無法改變(我也是試了之后才知道的),一種有效的解決方案是在窗體里面放一個Panel控件,dock屬性Fill,然后把PictureBox控件放在Panel中,大小改成和Panel控件一樣大,再加一個Panel控件的SizeChanged事件,隨時設置PictureBox控件和Panel控件一樣大。這里不細說,具體看下面的C#編碼實現(xiàn),咱重點說說PictureBox控件里的圖斑如何縮放和平移。要想實現(xiàn)縮放和平移,首先我們得了解它實現(xiàn)的原理,這是下面編碼實現(xiàn)的基礎。因為圖片隨PictureBox控件大小改變而按照原有比例縮放,因此我們改變PictureBox控件的大小,也就是它的Width和Height屬性,在視覺上就能看到圖片被放大和縮小,也就是縮放;當圖片被放大后,窗體中不能顯示完整的圖片內容,這時就需要我們通過平移來查看未能顯示在窗體上的圖片部分了,同樣的,我們只要改變PictureBox控件的位置,也就是它的Left和Top屬性,就能把需要展示的圖片局部正好顯示在窗體上,從而在視覺上看到圖片平移。原理簡單說明了一下后,所以,我們想要實現(xiàn)縮放與偏移,本質上就是計算PictureBox控件的大小和位置,只要搞定了這個,縮放平移也就搞定了。那么這個大小和位置咋算呢,請接著往下看。我們知道照片查看器縮放用的鼠標滾輪,前滾放大,后滾縮小。PictureBox控件中找一下,MouseWheel事件正好干這個事。再一查,哎呀,SystemInformation.MouseWheelScrollLines代碼滾一格(微軟叫它制動器)代表多少行。那就好辦了,我們把這個多少行按一定的比例轉換成PictureBox控件Left、Top、Width、Height四個屬性的增量,加上原值后,調整與顯示窗體大小以及圖片有效區(qū)域的位置關系,重新賦值回去就OK了。平移稍稍麻煩一點,其實也不是太麻煩。涉及到MouseDown、MouseMove、MouseUp三個事件,在鼠標按下時記錄下按下點坐標,同時標識正在平移操作;在鼠標移動時計算移動的距離,換算Left、Top的增量,并與顯示窗體大小和圖片有效區(qū)域做調整,最后賦值會這倆屬性;鼠標彈起時結束平移操作標識。3.編碼實現(xiàn)新建一個窗體應用程序,改窗體名稱為frmMian,在其內添加一個Panel控件,命名pel;再在Panel控件中添加一個PictureBox控件,命名pboImage,以下為窗體類需要編寫的代碼:?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174publicpartialclassfrmMian:Form{

publicfrmMian()

{

InitializeComponent();

this.pel.Dock=System.Windows.Forms.DockStyle.Fill;

this.pel.SizeChanged+=newSystem.EventHandler(this.pel_SizeChanged);

this.pboImage.Margin=newSystem.Windows.Forms.Padding(0);

this.pboImage.Location=newSystem.Drawing.Point(0,0);

this.pboImage.Size=newSystem.Drawing.Size(this.pel.Width,this.pel.Height);

this.pboImage.SizeMode=System.Windows.Forms.PictureBoxSizeMode.Zoom;

this.pboImage.Cursor=Cursors.SizeAll;

this.pboImage.MouseDown+=newSystem.Windows.Forms.MouseEventHandler(this.pboImage_MouseDown);

this.pboImage.MouseEnter+=newSystem.EventHandler(this.pboImage_MouseEnter);

this.pboImage.MouseMove+=newSystem.Windows.Forms.MouseEventHandler(this.pboImage_MouseMove);

this.pboImage.MouseUp+=newSystem.Windows.Forms.MouseEventHandler(this.pboImage_MouseUp);

this.pboImage.MouseWheel+=newSystem.Windows.Forms.MouseEventHandler(this.pboImage_MouseWheel);

pboImage.Image=Image.FromFile(@"C:\寶貝自拍照.jpg");

}

privateSystem.Drawing.PointMouseDownPoint=newSystem.Drawing.Point();//平移時鼠標按下的位置

privateboolIsSelected=false;

//鼠標是否是按下狀態(tài)

//pboImage獲取焦點事件

privatevoidpboImage_MouseEnter(objectsender,EventArgse)

{

pboImage.Focus();

}

//pboImage鼠標滾輪事件

privatevoidpboImage_MouseWheel(objectsender,MouseEventArgse)

{

if(pboImage.Image==null)return;

//計算縮放后的錨點和寬高

inti=e.Delta*SystemInformation.MouseWheelScrollLines/4;

intleft=pboImage.Left-i/2,top=pboImage.Top-i/2;

intwidth=pboImage.Width+i,heigth=pboImage.Height+i;

if(i<0)

//縮小時需要考慮與顯示范圍間關系,放大時無需考慮

{

//計算縮放后圖片有效范圍

doubleWidthScale=Convert.ToDouble(pboImage.Image.Width)/width;

doubleHeigthScale=Convert.ToDouble(pboImage.Image.Height)/heigth;

if(WidthScale>HeigthScale)

{

top=top+Convert.ToInt32(Math.Ceiling(heigth-(pboImage.Image.Height/WidthScale)))/2;

heigth=Convert.ToInt32(Math.Ceiling(pboImage.Image.Height/WidthScale));

}

else

{

left=left+Convert.ToInt32(Math.Ceiling(width-(pboImage.Image.Width/HeigthScale)))/2;

width=Convert.ToInt32(Math.Ceiling(pboImage.Image.Width/HeigthScale));

}

if(left>0)

//左側在顯示范圍內部,調整到左邊界

{

if(width-left<pel.Width)width=pel.Width;

elsewidth=width-left;

left=0;

}

if(left+width<pel.Width)//右側在顯示范圍內部,調整到右邊界

{

if(pel.Width-width>0)left=0;

elseleft=pel.Width-width;

width=pel.Width-left;

}

if(top>0)//上側在顯示范圍內部,調整到上邊界

{

if(heigth-top<pel.Height)heigth=pel.Height;

elseheigth=heigth-top;

top=0;

}

if(top+heigth<pel.Height)//下側在顯示范圍內部,調整到下邊界

{

if(pel.Height-heigth>0)top=0;

elsetop=pel.Height-heigth;

heigth=pel.Height-top;

}

}

pboImage.Width=width;

pboImage.Height=heigth;

pboImage.Left=left;

pboImage.Top=top;

}

//pboImage鼠標按下事件

privatevoidpboImage_MouseDown(objectsender,MouseEventArgse)

{

if(pboImage.Image==null)return;

if(e.Button==MouseButtons.Left)

{

//記錄摁下點坐標,作為平移原點

MouseDownPoint.X=PointToClient(System.Windows.Forms.Cursor.Position).X;

MouseDownPoint.Y=PointToClient(System.Windows.Forms.Cursor.Position).Y;

IsSelected=true;

pboImage.Cursor=Cursors.Hand;

}

}

//pboImage鼠標移動事件

privatevoidpboImage_MouseMove(objectsender,MouseEventArgse)

{

if(pboImage.Image==null)return;

//計算圖片有效范圍

doubleWidthScale=Convert.ToDouble(pboImage.Image.Width)/pboImage.Width;

doubleHeigthScale=Convert.ToDouble(pboImage.Image.Height)/pboImage.Height;

intInvalidTop=pboImage.Top,InvalidHeigth=pboImage.Height,InvalidLeft=pboImage.Left,InvalidWidth=pboImage.Width;

if(WidthScale>HeigthScale)

{

InvalidTop=InvalidTop+((int)Math.Ceiling(InvalidHeigth-(pboImage.Image.Height/WidthScale)))/2;

InvalidHeigth=(int)Math.Ceiling(pboImage.Image.Height/WidthScale);

}

else

{

InvalidLeft=InvalidLeft+((int)Math.Ceiling(InvalidWidth-(pboImage.Image.Width/HeigthScale)))/2;

InvalidWidth=(int)Math.Ceiling(pboImage.Image.Width/HeigthScale);

}

//鼠標是否摁在圖片上

boolIsMouseInPanel=InvalidLeft<PointToClient(System.Windows.Forms.Cursor.Position).X&&

PointToClient(System.Windows.Forms.Cursor.Position).X<InvalidLeft+InvalidWidth&&

InvalidTop<PointToClient(System.Windows.Forms.Cursor.Position).Y&&

PointToClient(System.Windows.Forms.Cursor.Position).Y<InvalidTop+InvalidHeigth;

if(IsSelected&&IsMouseInPanel)

{

//計算平移后圖片有效范圍的錨點和寬高

intleft=InvalidLeft+(PointToClient(System.Windows.Forms.Cursor.Position).X-MouseDownPoint.X);

inttop=InvalidTop+(PointToClient(System.Windows.Forms.Cursor.Position).Y-MouseDownPoint.Y);

intright=left+InvalidWidth;

intdown=top+InvalidHeigth;

if(left>=InvalidLeft&&left>=0)left=0;//向右平移且平移后在顯示范圍內部,調整到左邊界

if(left<InvalidLeft&&right<=pel.Width)left=left+pel.Width-right;//向左平移且平移后在顯示范圍內部,調整到右邊界

if(top>=InvalidTop&&top>=0)top=0;//向下平移且平移后在顯示范圍內部,調整到上邊界

if(top<InvalidTop&&down<=pel.Height)top=top+pel.Height-down;//向上

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論