




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中級財務會計學知到課后答案智慧樹章節(jié)測試答案2025年春湖南工學院
- 四川工業(yè)科技學院《景觀設計(1)》2023-2024學年第一學期期末試卷
- 西南民族大學《化工機械強度與振動》2023-2024學年第二學期期末試卷
- 洛陽理工學院《組織學與胚胎學(B)》2023-2024學年第二學期期末試卷
- 四川省資陽市2025屆五年級數(shù)學第二學期期末調研試題含答案
- 海南健康管理職業(yè)技術學院《中國古代文學A(V)》2023-2024學年第二學期期末試卷
- 大同煤炭職業(yè)技術學院《個案工作實務》2023-2024學年第二學期期末試卷
- 廣州華商學院《藥理學實驗A》2023-2024學年第二學期期末試卷
- 古詩詞中煉字的好處
- 工程質量控制中的常見問題與解決方案
- 《臺海危機》課件
- 部編版小學語文一年級下冊第三單元大單元教學設計教材分析
- MOOC 數(shù)據(jù)庫系統(tǒng)(中):建模與設計-哈爾濱工業(yè)大學 中國大學慕課答案
- 2024年湖南食品藥品職業(yè)學院單招職業(yè)技能測試題庫及答案解析
- 2024年江蘇醫(yī)藥職業(yè)學院單招職業(yè)技能測試題庫及答案解析
- 2024年全國高考物理電學實驗真題(附答案)
- 保育員基本素養(yǎng)知識講座
- 2024寧波樞智交通科技有限公司招聘筆試參考題庫附帶答案詳解
- 乳腺疏通課件
- 《5G無線網絡規(guī)劃與優(yōu)化》 課件 羅暉 第4-6章 5G行業(yè)應用-5G無線網絡優(yōu)化
- 藥物指導健康宣教
評論
0/150
提交評論