承香墨影 Android--Matrix图片变换处理
前言
本篇博客主要讲解一下如何处理对一个Bitmap对象进行处理,包括:缩放、旋转、位移、倾斜等。在最后将以一个简单的Demo来演示图片特效的变换。
本篇博客的主要内容:
Matrix
Matrix缩放
Matrix旋转
Matrix位移
Matrix倾斜
Matrix变换注意事项
Matrix完整的Demo
Matrix
对于一个图片变换的处理,需要Matrix类的支持,它位于"android.graphics.Matrix"包下,是Android提供的一个矩阵工具类,它本身不能对图像或View进行变换,但它可与其他API结合来控制图形、View的变换,如Canvas。
Matrix提供了一些方法来控制图片变换:
setTranslate(float dx,float dy):控制Matrix进行位移。
setSkew(float kx,float ky):控制Matrix进行倾斜,kx、ky为X、Y方向上的比例。
setSkew(float kx,float ky,float px,float py):控制Matrix以px、py为轴心进行倾斜,kx、ky为X、Y方向上的倾斜比例。
setRotate(float degrees):控制Matrix进行depress角度的旋转,轴心为(0,0)。
setRotate(float degrees,float px,float py):控制Matrix进行depress角度的旋转,轴心为(px,py)。
setScale(float sx,float sy):设置Matrix进行缩放,sx、sy为X、Y方向上的缩放比例。
setScale(float sx,float sy,float px,float py):设置Matrix以(px,py)为轴心进行缩放,sx、sy为X、Y方向上的缩放比例。
之前有提过,图片在内存中存放的就是一个一个的像素点,而对于图片的变换主要是处理图片的每个像素点,对每个像素点进行相应的变换,即可完成对图像的变换。上面已经列举了Matrix进行变换的常用方法,下面以几个Demo来讲解一下如何通过Matrix进行变换。
Matrix缩放
代码:
复制代码
1 /**
2 * 缩放图片
3 */
4 protected void bitmapScale(float x, float y) {
5 // 因为要将图片放大,所以要根据放大的尺寸重新创建Bitmap
6 Bitmap afterBitmap = Bitmap.createBitmap(
7 (int) (baseBitmap.getWidth() * x),
8 (int) (baseBitmap.getHeight() * y), baseBitmap.getConfig());
9 Canvas canvas = new Canvas(afterBitmap);
10 // 初始化Matrix对象
11 Matrix matrix = new Matrix();
12 // 根据传入的参数设置缩放比例
13 matrix.setScale(x, y);
14 // 根据缩放比例,把图片draw到Canvas上
15 canvas.drawBitmap(baseBitmap, matrix,paint);
16 iv_after.setImageBitmap(afterBitmap);
17 }
Matrix旋转
代码:
复制代码
1 /**
2 * 图片旋转
3 */
4 protected void bitmapRotate(float degrees) {
5 // 创建一个和原图一样大小的图片
6 Bitmap afterBitmap = Bitmap.createBitmap(baseBitmap.getWidth(),
7 baseBitmap.getHeight(), baseBitmap.getConfig());
8 Canvas canvas = new Canvas(afterBitmap);
9 Matrix matrix = new Matrix();
10 // 根据原图的中心位置旋转
11 matrix.setRotate(degrees, baseBitmap.getWidth() / 2,
12 baseBitmap.getHeight() / 2);
13 canvas.drawBitmap(baseBitmap, matrix, paint);
14 iv_after.setImageBitmap(afterBitmap);
15 }
Matrix位移
代码:
复制代码
1 /**
2 * 图片移动
3 */
4 protected void bitmapTranslate(float dx, float dy) {
5 // 需要根据移动的距离来创建图片的拷贝图大小
6 Bitmap afterBitmap = Bitmap.createBitmap(
7 (int) (baseBitmap.getWidth() * dx),
8 (int) (baseBitmap.getHeight() * dy), baseBitmap.getConfig());
9 Canvas canvas = new Canvas(afterBitmap);
10 Matrix matrix = new Matrix();
11 // 设置移动的距离
12 matrix.setTranslate(dx, dy);
13 canvas.drawBitmap(baseBitmap, matrix, paint);
14 iv_after.setImageBitmap(afterBitmap);
15 }
Matrix倾斜
代码:
复制代码
1 /**
2 * 倾斜图片
3 */
4 protected void bitmapSkew(float dx, float dy) {
5 // 根据图片的倾斜比例,计算变换后图片的大小,
6 Bitmap afterBitmap = Bitmap.createBitmap(baseBitmap.getWidth()
7 + (int) (baseBitmap.getWidth() * dx), baseBitmap.getHeight()
8 + (int) (baseBitmap.getHeight() * dy), baseBitmap.getConfig());
9 Canvas canvas = new Canvas(afterBitmap);
10 Matrix matrix = new Matrix();
11 // 设置图片倾斜的比例
12 matrix.setSkew(dx, dy);
13 canvas.drawBitmap(baseBitmap, matrix, paint);
14 iv_after.setImageBitmap(afterBitmap);
15 }
Matrix变换注意事项
上面几个小方法演示了如何使用Matrix进行变换,但是还有几点需要额外注意一下:
对于一个从BitmapFactory.decodeXxx()方法加载的Bitmap对象而言,它是一个只读的,无法对其进行处理,必须使用Bitmap.createBitmap()方法重新创建一个Bitmap对象的拷贝,才可以对拷贝的Bitmap进行处理。
因为图像的变换是针对每一个像素点的,所以有些变换可能发生像素点的丢失,这里需要使用Paint.setAnitiAlias(boolean)设置来消除锯齿,这样图片变换后的效果会好很多。
在重新创建一个Bitmap对象的拷贝的时候,需要注意它的宽高,如果设置不妥,很可能变换后的像素点已经移动到"图片之外"去了。
闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻锝夊箣閿濆憛鎾绘煕閵堝懎顏柡灞剧洴椤㈡洟鏁愰崱娆欑喘闂備線鈧偛鑻崢鎼佹煟閹虹偛顩柟骞垮灩閳规垹鈧綆浜為ˇ鏉款渻閵堝棙灏靛┑顖e幖鍗遍柛妤冨亹閺€浠嬫煟閹邦剛鎽犵紓宥嗗灴閺屾稑顫濋澶婂壈鐎光偓閿濆懐浠㈤柍璇查叄楠炲鈹戦幇顓ф%闂傚倷鑳堕~瀣礋閸偆鏆﹂梻浣瑰▕閺€閬嶅垂閸洖桅闁告洦鍨扮粻鎶芥煕閳╁啨浠﹀瑙勬礈缁辨捇宕掑▎鎴М濡炪倧瀵岄崹鍫曘€佸棰濇晣闁绘ɑ褰冮悘濠冪節閻㈤潧校闁煎綊绠栧畷姗€鍩€椤掆偓椤啴濡堕崱妯烘殫闂佸摜濮甸幑鍥х暦閵忋倕绠瑰ù锝呭帨閹锋椽姊虹涵鍛汗闁稿鐩畷婵單旈崨顔惧幐闂佸憡渚楅崰姘垛€栨總鍛婄厓妞ゅ繐鎳忕亸锔芥叏婵犲嫮甯涢柟宄版嚇瀹曘劑妫冨☉姘毙ㄥ銈冨灪閻楃姴鐣烽崡鐐╂婵☆垳鈷堥崬鍫曟⒒娴e摜绉烘俊顐ユ硶缁牊绗熼埀顒勫箖閿熺姴鐏抽柟棰佽兌閸炵敻鏌i悩鐑橆仩閻忓繈鍔戝畷婵嬫偄閸忚偐鍘搁梺绯曟閸橀箖鎮鹃悽鍛婄厸閻忕偛澧藉ú鏉戔攽閿涘嫬鍘村┑顔瑰亾闂佹枼鏅涢崯鎷屻亹閸ヮ剚鈷掑ù锝堟鐢稓绱掔€n亞绠荤€规洘娲栭悾鐑藉炊椤垶缍楅梻浣筋潐瀹曟﹢顢氳婢规洟宕楅懖鈺冾啎闂佺硶鍓濋敋濞e浂鍨堕弻娑㈡倷閼碱剛楔濠殿喖锕ュ浠嬪蓟閸涘瓨鍊烽柤鑹版硾椤忣厽绻濋埛鈧仦鑺ョ彎闂佸搫鏈惄顖炲箖閵忋倖鐓ラ悗锝庝簷濞n喗淇婇悙顏勨偓鎴﹀垂閸濆嫀娑㈠礃椤旇 鍋撴担鍓叉建闁逞屽墴楠炲啴鍩¢崪浣规櫇濡炪値鍋掗崢濂杆夊鑸碘拺闁煎鍊曢弸鎴︽煟閻旀潙鍔ら柍褜鍓氶崙褰掑储閸撗冨灊闁割偁鍎辩粈鍐┿亜韫囨挻顥犻柨娑欑矒閺岋綁鎮╅崣澶屸敍闁诲繐绻戦悷锕傚疾閸洘鏅滅紒娑橆儐椤旀棃姊虹紒妯哄鐟滄澘鍟村鎶芥晲婢跺鍘遍梺鍐叉惈椤戝洨寮ч埀顒勬倵鐟欏嫭纾搁柛鏃€鍨块妴浣糕槈濮楀棙鍍靛銈嗗笒閸婃悂顢氭潏銊х瘈缁炬澘顦辩壕鍧楁煕鐎n偄鐏寸€规洘鍔欏浠嬵敇閻愭鍞堕梻浣虹帛閸旓箓宕滃璺虹煑闊洦绋掗悡锝夌叓閸ラ鍒板ù婊呭仦閵囧嫰鍩¢崒婊冨绩闂佸搫鏈ú婵堢不濞戙垹鍗抽柣鎰姈閻╊垶寮婚敓鐘茬劦妞ゆ帊鑳堕々鐑芥倵閿濆骸浜為柛妯圭矙濮婃椽鎮烽幍顔芥喖缂備浇顕ч崯顐︻敊韫囨挴鏀介悗锝庡亞閸橀亶姊洪崷顓炲妺闁哄被鍔戦妴鍌炴嚃閳哄啰锛滅紓鍌欑劍宀e灝煤鐎电硶鍋撳▓鍨灈闁绘牕銈搁悰顔锯偓锝庝簴閺€浠嬫煙闁缚绨界痪鐐劤閳规垶骞婇柛濠冾殕閹便劑鎮滈挊澶岋紱濠电偞鍨剁喊宥呯暦閸欏鍙忔俊鐐额嚙娴滈箖鎮楀▓鍨珮闁稿锕悰顔嘉熼懖鈺冿紲濠碘槅鍨崇划顖烆敂閻斿吋鈷掑ù锝堝Г绾爼鏌涢敐蹇曠暤妤犵偛绻橀弫鎾绘晸閿燂拷/QQ 1602007闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻锝夊箣閿濆憛鎾绘煕婵犲倹鍋ラ柡灞诲姂瀵噣宕奸悢鍛婎唶闂備胶枪椤戝棝骞愰崜褍鍨濇い鎾跺亹濡插牊淇婇婵愬殭婵炲憞鍥ㄢ拺婵炶尪顕ч獮妤呮煟閻斿弶娅婄€殿喖顭烽幃銏ゅ川婵犲嫮肖濠德板€х徊浠嬪疮椤栫儐鏁佺€广儱顦伴埛鎴︽煙閼测晛浠滈柍褜鍓氶悧鐘茬暦濠靛鍐€妞ゆ挾鍊i敃鍌涚厱闁哄洢鍔岄悘鐘绘煕閹般劌浜惧┑锛勫亼閸婃牠宕濋敃鈧…鍧楀焵椤掑倻纾兼い鏃囧亹閸╋絾鎱ㄦ繝鍌涙儓閻撱倝鎮归崶銊ョ祷缂佺姴鎼—鍐Χ閸愩劌顬堥梺缁橆殕閹瑰洭鎮伴钘夌窞鐎光偓閳ь剟鎯屽▎鎰闁糕剝锚閸斻倝鏌熼钘夌仸缂佺粯绻堟慨鈧柨婵嗘閵嗘劙姊洪幐搴㈢┛缂佺姵鎸搁悾鐑藉閻樺棙妞介、鏃堝川椤忓懎顏归梻鍌欑閹诧紕鎹㈤崒婧惧亾濮樼厧澧寸€殿喖鍟块埢搴ㄥ箻鐎电ǹ骞楁繝寰锋澘鈧劙宕戦幘缈犵箚妞ゆ劧绲块幊鍥┾偓瑙勬礃濞茬喖銆侀弴銏℃櫆閻熸瑱绲剧€氳棄鈹戦悙鑸靛涧缂佹彃娼¢獮濠囧箻濞茬粯鏅┑鐘诧工閹虫劗澹曟總鍛婂仯闁搞儯鍔岀徊濠氭煃瑜滈崜娆撴倶濠靛鍋╅柣鎴f缁犳盯鏌℃径濠勪虎缂佹劖绋掔换婵嬫偨闂堟刀銏ゆ倵濮橆剙妲婚悡銈夋煙闂傚鍔嶉柍閿嬪灴閹綊宕堕敐鍌氫壕鐎规洖娲犻崑鎾寸節濮橆厾鍘撻悷婊勭矒瀹曟粓鎮㈡總澶婃闂侀潧饪垫俊鍥€呴悜鑺ュ€甸柨婵嗛娴滅偤鏌涘Ο鎸庮棄闁宠鍨块崺銉╁幢濡ゅ啩娣繝鐢靛仜椤︽澘煤濠婂牊鍤嶉梺顒€绉撮柨銈嗕繆閵堝嫯鍏岄柛姗€浜跺Λ鍛搭敃閵忊€愁槱闂佽鐡曢褔鏁冮姀鈥愁嚤閻庢稒岣块崢顏堟⒑閹肩偛鍔€闁告劕褰炵槐鏃€淇婇妶鍥ラ柛瀣☉鐓ゆい鎾亾閳ь兛绶氬顕€宕煎┑鍡氣偓鍨攽閻愬弶顥為柛銊ф暬閻涱噣宕卞☉娆屾嫽闂佺ǹ鏈悷褔藝閿曞倹鐓欑痪鏉垮船娴滀即鏌熼姘拱鐎垫澘瀚禒锕傚箚瑜嶇花銉︾節閻㈤潧鈻堟繛浣冲吘娑樷槈閵忕姵杈堥梺鎸庢礀閸婂綊鎮″▎鎾寸厽闁瑰浼濋鍫熷€剁€广儱顦伴悡鏇熴亜閹伴潧浜楅梺顓у灡椤ㄣ儵鎮欑€电ǹ鈪归柤鎸庡姈閵囧嫰骞掗崱妞惧闂備浇顕уù姘椤忓牆钃熼柨鐔哄Т楠炪垺绻涢崱妤冪缂侇喖鐖煎铏光偓鍦濞兼劙鏌涢妸銉﹀仴妤犵偛鍟埢搴ょ疀閿濆懏娅婃俊鐐€栭弻銊╁触鐎n噮鏁婄€广儱鎳夐弨浠嬫煟濡澧柛鐔风箻閺屾盯鎮╅幇浣圭杹濡ょ姷鍋為崝娆撶嵁鎼淬劍瀵犲璺虹灱閺嗩偊鏌i悢鍝ョ煁婵☆偄鍟撮幃浼搭敊閸㈠鍠栧畷妤呮偂鎼达絽閰遍梻鍌欐祰閸嬫劙鍩涢崼銉ョ婵炴垯鍨瑰Ч鎻捗归悡搴f憼闁抽攱甯掗湁闁挎繂鎳忛崯鐐烘煕閻斿搫浠︾紒缁樼〒閹风姾顦撮柣锝囨暩閳ь剝顫夊ú鏍礊婵犲洤钃熼柛鈩冾殢閸氬鏌涘☉鍗炵伈缂侀亶浜跺缁樻媴閸涘﹤鏆堝┑鐐额嚋缁犳挸鐣疯ぐ鎺撶劶鐎广儱妫楁禍妤呮⒑閹稿海绠撴い锕備憾瀹曪綁骞樼紒妯煎幈闂侀潧顧€缁茶姤淇婃禒瀣€堕煫鍥ч瀹撳棝鏌熼鑲╃Ш妤犵偛娲畷婊勬媴閾忚顫岄梺璇插椤旀牠宕抽鈧畷鎴炵節閸屾粍娈炬繝闈涘€绘灙閸烆垶姊洪幐搴㈩梿妞ゎ偄顦遍埀顒佷亢濡嫰鍩為幋锔藉€烽悗娑櫭棄宥夋⒑缁洘娅呴柛鐔告綑閻g兘骞嬮敃鈧粻濠氭倵闂堟稒鎲告い鏃€娲樼换娑欐綇閸撗冨煂闂佸摜鍠庡ḿ鈥崇暦閵夈儙鐔烘偘閳╁喚娼旀繝纰樻閸ㄨ京鍒掑鍛傛盯宕橀妸褎娈惧銈呯箰閹冲繑鍒婇幘顔藉仭婵炲棗绻愰顏堟煟濠靛浂娈滄慨濠傤煼瀹曟帒鈻庨幋顓熜滈梻浣筋潐缁佹挳宕滃┑鍫㈢當闁绘棁鍋ら弮鍫濆窛妞ゆ挾濮峰畷鑸电節濞堝灝鏋熼弸顏嗙磽閸粌宓嗛柛鈹惧亾濡炪倖宸婚崑鎾绘煙閾忣個顏堫敋閿濆棛绡€婵﹩鍎甸妸鈺傜叆闁哄啠鍋撻柛搴㈠▕閻涱噣骞囬悧鍫氭嫽婵炶揪缍€椤宕戦悩缁樼厱閹兼惌鍠栧▍宥団偓娈垮枟瑜板啴鍩ユ径鎰潊闁绘ɑ褰冨▓銈夋⒒娴e憡鎯堥柛鐕佸亰閹勭節閸ャ劌浜楅梺鍛婂姦閸犳鎮¢悢鍏肩厽闁哄啫浼嬭ぐ鎹ゅ鈧綆鍠栭弸渚€鏌涢鐘插姕闁抽攱鍨块弻娑樷攽閸℃浼傞柣搴㈢婢瑰棛妲愰幒鎾崇窞閹兼惌鍠楃紞鍫熺箾閿濆懏鎼愰柨鏇ㄤ邯楠炲啫饪伴崼鐔风檮婵犮垹鍘滈弬鍌炲礉閹达箑钃熼柡鍥╁枎缁剁偞绻涢幋娆忕仾妞ゅ骸绉瑰鐑樺濞嗘帩鍚呯紓鍌氱С缁舵艾顕f繝姘櫜濠㈣泛顑呮禍婊堟⒑閸涘﹦缂氶柛搴㈠▕閹剝鎷呯化鏇熸杸闂佺粯锕╅崰鏍倶椤忓牊鐓ユ慨妯垮煐閹虫岸鏌i幇顔剧瘈缂佽妫濋弻鏇㈠醇濠靛洤娅ら梺闈╃秬濞咃絿妲愰幒妤佸亹闁告劕寮剁拠鐐测攽椤旂》鍔熺紒顕呭灦楠炲繘宕ㄩ弶鎴濈獩闂傚倸鐗婄粙鎺旀嫻閿熺姵鐓欐鐐茬仢閻忓弶顨ラ悙鏉戠瑨閾绘牠鏌嶈閸撶喖骞冮敓鐘插嵆闁靛骏绱曢崢鍗烆渻閵堝棗濮х紒鍙夊娣囧﹪宕堕浣哄幐闁诲函缍嗛崑鍛此夐崼銉︾厸鐎光偓鐎n剛鐦堥悗瑙勬礃閿曘垺淇婇幖浣肝ㄩ柕蹇曞С婢规洟鎮峰⿰鍛暭閻㈩垱甯炵划锝呂旈崨顔惧幍闂佽顔栭崰鏍€傛總鍛婄厱閻庯絻鍔屾俊浠嬫煏閸パ冾伃鐎殿喕绮欓幃浠嬫濞戞ḿ鍘掗梻鍌欑閹碱偊顢栭崶顒€绐楅柡宥庡幖缁犳牗淇婇妶鍌氫壕濡炪値鍋呯换鍫ュ箖濞嗘搩鏁嗛柍褜鍓熼、鏃堟晸閿燂拷
>更多相关文章
首页推荐
佛山市东联科技有限公司一直秉承“一切以用户价值为依归
- 01-11全球最受赞誉公司揭晓:苹果连续九年第一
- 12-09罗伯特·莫里斯:让黑客真正变黑
- 12-09谁闯入了中国网络?揭秘美国绝密黑客小组TA
- 12-09警示:iOS6 惊现“闪退”BUG
- 03-08消息称微软开发内部AI推理模型,或将成为Op
- 03-08美国法院驳回马斯克请求,未阻止OpenAI转型
- 03-08饿了么成立即时配送算法专家委员会 持续全局
- 03-08长安汽车:预计今年底长安飞行汽车将完成试
- 03-08谷歌推出虚拟试穿、AR美妆新功能
相关文章
24小时热门资讯
24小时回复排行
热门推荐
最新资讯
操作系统
黑客防御