android 图片剪裁
android crop用法

android crop用法在Android 中,要裁剪(crop)图像,一种常见的方式是使用系统内置的裁剪工具或通过使用第三方库实现。
以下是两种常见的方法:方法1: 使用系统内置的裁剪工具1. 启动裁剪意图:```javaIntent cropIntent = new Intent("com.android.camera.action.CROP");cropIntent.setDataAndType(uri, "image/*");cropIntent.putExtra("crop", "true");cropIntent.putExtra("aspectX", 1);cropIntent.putExtra("aspectY", 1);cropIntent.putExtra("outputX", 256);cropIntent.putExtra("outputY", 256);cropIntent.putExtra("return-data", true);startActivityForResult(cropIntent, CROP_REQUEST_CODE);```在上述代码中,`uri` 是原始图像的URI,`aspectX` 和`aspectY` 表示裁剪框的宽高比,`outputX` 和`outputY` 表示裁剪后输出图像的宽高。
2. 处理裁剪结果:```java@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == CROP_REQUEST_CODE && resultCode == RESULT_OK) {Bundle extras = data.getExtras();if (extras != null) {Bitmap croppedBitmap = extras.getParcelable("data");// 处理裁剪后的图像}}}```方法2: 使用第三方库在Android 中,你还可以使用一些第三方库来简化裁剪操作,例如`UCrop`。
Android图片裁剪功能实现代码

Android图⽚裁剪功能实现代码在Android应⽤中,图⽚裁剪也是⼀个经常⽤到的功能。
Android系统中可以⽤隐式意图调⽤系统应⽤进⾏裁剪,但是这样做在不同的⼿机可能表现出不同的效果,甚⾄在某些奇葩⼿机上还会出其他更奇怪的问题,所以调⽤系统功能进⾏图⽚裁剪在很多时候对我们来说并不是⼀个好的选择。
这时候就需要我们⾃⼰去实现这种裁剪功能了。
功能分析要完成图⽚裁剪的功能,我们需要先知道图⽚裁剪的功能有哪些。
图⽚裁剪之前,我们需要有⼀个框指⽰我们需要裁剪的样式合⼤⼩。
图⽚显⽰出来后⼤⼩和位置可能并不是我们所期望的,所以我们还需要对图⽚进⾏移动、缩放等操作。
确定好位置和⼤⼩后,我们需要真正的对图⽚进⾏裁剪,并将裁剪的图⽚存起来以供使⽤。
也就是说需要实现图⽚裁剪的功能细分后如下:1、显⽰指⽰框2、图⽚移动和缩放3、图⽚裁剪并保存最终效果展⽰如下:功能实现显⽰指⽰框要实现显⽰⼀个如上图⼀样的指⽰框有很多⽅法,这⾥实现的⽅式是⽤⾃定义的Drawable作为View的背景,然后将这个View 覆盖在原图⽚上作为指⽰框。
为了在⼀定程度上满⾜更多的要求,我们让指⽰框可设置为矩形也可设置为圆形,阴影区域的颜⾊也可设置。
要绘制出作为指⽰的图层,我们可以将它拆分成两半,变成两个封闭的Path进⾏绘制,也可以先绘制出半透明的覆盖层,然后在中间裁剪⼀个洞。
显然,要考虑到这个洞的形状⼤⼩并不是固定的,裁剪的⽅式⽐拆分成两个封闭的Path要简单多了。
Canvas的canvas.clipPath(Path, Region.Op);⽅法,可以对Canvas进⾏裁剪,可以很容易得到这样的指⽰框。
然⽽Canvas的clipPath裁剪出来的曲线图形会有锯齿,我多番尝试都没能去掉锯齿,所以不得不放弃这个⽅法。
继⽽利⽤paint的paint.setXfermode(new PorterDuffXfermode(mode))⽅法来实现这个效果。
Android中自定义图片的裁剪形状

Android中自定义图片的 裁剪形状
Android中的ImageView | 问题描述
2
问题描述
如何显示类似左图中所示的椭圆形图片? 如何根据需要显示各种形状的图片?
Android中的ImageView | 问题解s/drawable中添加需要绘制的图片(原图如下所示)
Android中的ImageView | 小结
9
Shape的继承关系
6
问题解决方案
视图类ShapesOfImgs重写父类的onDraw方法如下:
Android中的ImageView | 问题解决方案
7
问题解决方案
最后,在src目录包中修改MainActivity.java:
Android中的ImageView | 小结
8
各种形状的ImageView
• 实现各种形状的ImageView要用到BitmapShader类 • BitmapShader是Shader的子类,可以通过Paint.setShader(Shader shader)进行设置、
Android中的ImageView | 问题解决方案
Android图片裁剪功能实现详解

Android图片裁剪功能实现详解最近有看到有朋友在讨论QQ头像的裁剪上传是怎么实现的,吼吼,小马也没做过,好奇之下学习下,发现以前项目中有类型的功能,结合官方文档里面的解释,就更好玩了,周末,急急忙忙写的,记录在博客里,希望能与大家交流学习,也恳请高手能解答小马在代码注释中提出的疑问,不管有没有人回答,小马先谢谢了,一样的,先看下效果图(效果图小马不解释了,直接流水写下去,小马是直接在模拟器里写的,能在真机上使用,因为很简单),再看代码是怎么实现的:一:主布局界面二:点击控件触发事件后效果图三:拍照完之后效果图四:裁剪界面效果图五:点击相册后返回的图片效果图六:裁剪完从相册PICK的保存后的效果图下面直接来看下主控制类代码,如下:1. package com.xiaoma.piccut.demo;2.3. import java.io.File;4. import android.app.Activity;5. import android.app.AlertDialog;6. import android.content.DialogInterface;7. import android.content.Intent;8. import android.graphics.Bitmap;9. import android.graphics.drawable.BitmapDrawable;10. import android.graphics.drawable.Drawable;11. import .Uri;12. import android.os.Bundle;13. import android.os.Environment;14. import android.provider.MediaStore;15. import android.view.View;16. import android.view.View.OnClickListener;17. import android.widget.Button;18. import android.widget.ImageButton;19. import android.widget.ImageView;20. /**21. * @Title: PicCutDemoActivity.java22. * @Package com.xiaoma.piccut.demo23. * @Description: 图片裁剪功能测试24. * @author XiaoMa25. */26. public class PicCutDemoActivity extends Activity implements OnClickListener {27.28. private ImageButton ib = null;29. private ImageView iv = null;30. private Button btn = null;31. private String tp = null;32.33.34. /** Called when the activity is first created. */35. @Override36. public void onCreate(Bundle savedInstanceState) {37. super.onCreate(savedInstanceState);38. setContentView(yout.main);39. //初始化40. init();41. }42.43. /**44. * 初始化方法实现45. */46. private void init() {47. ib = (ImageButton) findViewById(R.id.imageButton1);48. iv = (ImageView) findViewById(R.id.imageView1);49. btn = (Button) findViewById(R.id.button1);50. ib.setOnClickListener(this);51. iv.setOnClickListener(this);52. btn.setOnClickListener(this);53. }54.55.56. /**57. * 控件点击事件实现58. *59. * 因为有朋友问不同控件的背景图裁剪怎么实现,60. * 我就在这个地方用了三个控件,只为了自己记录学习61. * 大家觉得没用的可以跳过啦62. */63. @Override64. public void onClick(View v) {65. switch (v.getId()) {66. case R.id.imageButton1:67. ShowPickDialog();68. break;69. case R.id.imageView1:70. ShowPickDialog();71. break;72. case R.id.button1:73. ShowPickDialog();74. break;75.76. default:77. break;78. }79. }80.81. /**82. * 选择提示对话框83. */84. private void ShowPickDialog() {85. new AlertDialog.Builder(this)86. .setTitle("设置头像...")87. .setNegativeButton("相册", new DialogInterface.OnClickListener() {88. public void onClick(DialogInterface dialog, int which) {89. dialog.dismiss();90. /**91. * 刚开始,我自己也不知道ACTION_PICK是干嘛的,后来直接看Intent源码,92. * 可以发现里面很多东西,Intent是个很强大的东西,大家一定仔细阅读下93. */94. Intent intent = new Intent(Intent.ACTION_PICK, null);95.96. /**97. * 下面这句话,与其它方式写是一样的效果,如果:98. * intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);99. * intent.setType(""image/*");设置数据类型100. * 如果朋友们要限制上传到服务器的图片类型时可以直接写如:"image/jpeg 、 image/png等的类型" 101. * 这个地方小马有个疑问,希望高手解答下:就是这个数据URI与类型为什么要分两种形式来写呀?有什么区别?102. */103. intent.setDataAndType(104. MediaStore.Images.Media.EXTERNAL_CONTENT_URI,105. "image/*");106. startActivityForResult(intent, 1);107.108. }109. })110. .setPositiveButton("拍照", new DialogInterface.OnClickListener() {111. public void onClick(DialogInterface dialog, int whichButton) {112. dialog.dismiss();113. /**114. * 下面这句还是老样子,调用快速拍照功能,至于为什么叫快速拍照,大家可以参考如下官方115. * 文档,you_sdk_path/docs/guide/topics/media/camera.html116. * 我刚看的时候因为太长就认真看,其实是错的,这个里面有用的太多了,所以大家不要认为117. * 官方文档太长了就不看了,其实是错的,这个地方小马也错了,必须改正118. */119. Intent intent = new Intent(120. MediaStore.ACTION_IMAGE_CAPTURE);121. //下面这句指定调用相机拍照后的照片存储的路径122. intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri123. .fromFile(new File(Environment124. .getExternalStorageDirectory(),125. "xiaoma.jpg")));126. startActivityForResult(intent, 2);127. }128. }).show();129. }130.131. @Override132. protected void onActivityResult(int requestCode, int resultCode, Intent data) {133. switch (requestCode) {134. // 如果是直接从相册获取135. case 1:136. startPhotoZoom(data.getData());137. break;138. // 如果是调用相机拍照时139. case 2:140. File temp = new File(Environment.getExternalStorageDirectory()141. + "/xiaoma.jpg");142. startPhotoZoom(Uri.fromFile(temp));143. break;144. // 取得裁剪后的图片145. case 3:146. /**147. * 非空判断大家一定要验证,如果不验证的话,148. * 在剪裁之后如果发现不满意,要重新裁剪,丢弃149. * 当前功能时,会报NullException,小马只150. * 在这个地方加下,大家可以根据不同情况在合适的151. * 地方做判断处理类似情况152. *153. */154. if(data != null){155. setPicToView(data);156. }157. break;158. default:159. break;160.161. }162. super.onActivityResult(requestCode, resultCode, data);163. }164.165. /**166. * 裁剪图片方法实现167. * @param uri168. */169. public void startPhotoZoom(Uri uri) {170. /*171. * 至于下面这个Intent的ACTION是怎么知道的,大家可以看下自己路径下的如下网页172. * yourself_sdk_path/docs/reference/android/content/Intent.html173. * 直接在里面Ctrl+F搜:CROP ,之前小马没仔细看过,其实安卓系统早已经有自带图片裁剪功能, 174. * 是直接调本地库的,小马不懂C C++ 这个不做详细了解去了,有轮子就用轮子,不再研究轮子是怎么175. * 制做的了...吼吼176. */177. Intent intent = new Intent("com.android.camera.action.CROP");178. intent.setDataAndType(uri, "image/*");179. //下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪180. intent.putExtra("crop", "true");181. // aspectX aspectY 是宽高的比例182. intent.putExtra("aspectX", 1);183. intent.putExtra("aspectY", 1);184. // outputX outputY 是裁剪图片宽高185. intent.putExtra("outputX", 150);186. intent.putExtra("outputY", 150);187. intent.putExtra("return-data", true);188. startActivityForResult(intent, 3);189. }190.191. /**192. * 保存裁剪之后的图片数据193. * @param picdata194. */195. private void setPicToView(Intent picdata) {196. Bundle extras = picdata.getExtras();197. if (extras != null) {198. Bitmap photo = extras.getParcelable("data");199. Drawable drawable = new BitmapDrawable(photo);200.201. /**202. * 下面注释的方法是将裁剪之后的图片以Base64Coder的字符方式上203. * 传到服务器,QQ头像上传采用的方法跟这个类似204. */205.206. /*ByteArrayOutputStream stream = new ByteArrayOutputStream();207. press(pressFormat.JPEG, 60, stream);208. byte[] b = stream.toByteArray();209. // 将图片流以字符串形式存储下来210.211. tp = new String(Base64Coder.encodeLines(b));212. 这个地方大家可以写下给服务器上传图片的实现,直接把tp直接上传就可以了,213. 服务器处理的方法是服务器那边的事了,吼吼214.215. 如果下载到的服务器的数据还是以Base64Coder的形式的话,可以用以下方式转换216. 为我们可以用的图片类型就OK啦...吼吼217. Bitmap dBitmap = BitmapFactory.decodeFile(tp);218. Drawable drawable = new BitmapDrawable(dBitmap);219. */220. ib.setBackgroundDrawable(drawable);221. iv.setBackgroundDrawable(drawable);222. }223. }224.225. }下面来看下裁剪中用到的类,大家详细看下头注释:1. package com.xiaoma.piccut.demo;2.3.4.5.6. /**7. * 下面这些注释是下载这个类的时候本来就有的,本来要删除的,但看了下竟然是license,吼吼,8. * 好东西,留在注释里,以备不时之用,大家有需要加license的可以到下面的网址找哦9. */9. */10.11. //EPL, Eclipse Public License, V1.0 or later, /legal12. //LGPL, GNU Lesser General Public License, V2.1 or later, /licenses/lgpl.html13. //GPL, GNU General Public License, V2 or later, /licenses/gpl.html14. //AL, Apache License, V2.0 or later, /licenses15. //BSD, BSD License, /licenses/bsd-license.php16. /**17. * A Base64 encoder/decoder.18. *19. * <p>20. * This class is used to encode and decode data in Base64 format as described in RFC 1521.21. *22. * <p>23. * Project home page: <a href="/base64coder/java/">/base64coder/java</a><br>24. * Author: Christian d'Heureuse, Inventec Informatik AG, Zurich, Switzerland<br>25. * Multi-licensed: EPL / LGPL / GPL / AL / BSD.26. */27.28. /**29. * 这个类在上面注释的网址中有,大家可以自行下载下,也可以直接用这个,30. * 公开的Base64Coder类(不用深究它是怎么实现的,31. * 还是那句话,有轮子直接用轮子),好用的要死人了...32. * 小马也很无耻的引用了这个网址下的东东,吼吼...33. * @Title: Base64Coder.java34. * @Package com.xiaoma.piccut.demo35. * @Description: TODO36. * @author XiaoMa37. */38.39. public class Base64Coder {40.41. //The line separator string of the operating system.42. private static final String systemLineSeparator = System.getProperty("line.separator");43.44. //Mapping table from 6-bit nibbles to Base64 characters.45. private static char[] map1 = new char[64];46. static {47. int i=0;48. for (char c='A'; c<='Z'; c++) map1[i++] = c;49. for (char c='a'; c<='z'; c++) map1[i++] = c;50. for (char c='0'; c<='9'; c++) map1[i++] = c;51. map1[i++] = '+'; map1[i++] = '/'; }52.53. //Mapping table from Base64 characters to 6-bit nibbles.54. private static byte[] map2 = new byte[128];55. static {56. for (int i=0; i<map2.length; i++) map2[i] = -1;57. for (int i=0; i<64; i++) map2[map1[i]] = (byte)i; }58.59. /**60. * Encodes a string into Base64 format.61. * No blanks or line breaks are inserted.62. * @param s A String to be encoded.63. * @return A String containing the Base64 encoded data.64. */65. public static String encodeString (String s) {66. return new String(encode(s.getBytes())); }67.68. /**69. * Encodes a byte array into Base 64 format and breaks the output into lines of 76 characters.70. * This method is compatible with <code>sun.misc.BASE64Encoder.encodeBuffer(byte[])</code>.71. * @param in An array containing the data bytes to be encoded.72. * @return A String containing the Base64 encoded data, broken into lines.73. */74. public static String encodeLines (byte[] in) {75. return encodeLines(in, 0, in.length, 76, systemLineSeparator); }76.77. /**78. * Encodes a byte array into Base 64 format and breaks the output into lines.79. * @param in An array containing the data bytes to be encoded.80. * @param iOff Offset of the first byte in <code>in</code> to be processed.81. * @param iLen Number of bytes to be processed in <code>in</code>, starting at <code>iOff</code>.82. * @param lineLen Line length for the output data. Should be a multiple of 4.83. * @param lineSeparator The line separator to be used to separate the output lines.84. * @return A String containing the Base64 encoded data, broken into lines.85. */86. public static String encodeLines (byte[] in, int iOff, int iLen, int lineLen, String lineSeparator) {87. int blockLen = (lineLen*3) / 4;88. if (blockLen <= 0) throw new IllegalArgumentException();89. int lines = (iLen+blockLen-1) / blockLen;90. int bufLen = ((iLen+2)/3)*4 + lines*lineSeparator.length();91. StringBuilder buf = new StringBuilder(bufLen);92. int ip = 0;93. while (ip < iLen) {94. int l = Math.min(iLen-ip, blockLen);95. buf.append (encode(in, iOff+ip, l));96. buf.append (lineSeparator);97. ip += l; }98. return buf.toString(); }99.100. /**101. * Encodes a byte array into Base64 format.102. * No blanks or line breaks are inserted in the output.103. * @param in An array containing the data bytes to be encoded.104. * @return A character array containing the Base64 encoded data.105. */106. public static char[] encode (byte[] in) {107. return encode(in, 0, in.length); }108.109. /**110. * Encodes a byte array into Base64 format.111. * No blanks or line breaks are inserted in the output.112. * @param in An array containing the data bytes to be encoded.113. * @param iLen Number of bytes to process in <code>in</code>.114. * @return A character array containing the Base64 encoded data.115. */116. public static char[] encode (byte[] in, int iLen) {117. return encode(in, 0, iLen); }118.119. /**120. * Encodes a byte array into Base64 format.121. * No blanks or line breaks are inserted in the output.122. * @param in An array containing the data bytes to be encoded.123. * @param iOff Offset of the first byte in <code>in</code> to be processed.124. * @param iLen Number of bytes to process in <code>in</code>, starting at <code>iOff</code>.125. * @return A character array containing the Base64 encoded data.126. */127. public static char[] encode (byte[] in, int iOff, int iLen) {128. int oDataLen = (iLen*4+2)/3; // output length without padding129. int oLen = ((iLen+2)/3)*4; // output length including padding130. char[] out = new char[oLen];131. int ip = iOff;132. int iEnd = iOff + iLen;133. int op = 0;134. while (ip < iEnd) {135. int i0 = in[ip++] & 0xff;136. int i1 = ip < iEnd ? in[ip++] & 0xff : 0;137. int i2 = ip < iEnd ? in[ip++] & 0xff : 0;138. int o0 = i0 >>> 2;139. int o1 = ((i0 & 3) << 4) | (i1 >>> 4);140. int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6);141. int o3 = i2 & 0x3F;142. out[op++] = map1[o0];143. out[op++] = map1[o1];144. out[op] = op < oDataLen ? map1[o2] : '='; op++;145. out[op] = op < oDataLen ? map1[o3] : '='; op++; }146. return out; }147.148. /**149. * Decodes a string from Base64 format.150. * No blanks or line breaks are allowed within the Base64 encoded input data.151. * @param s A Base64 String to be decoded.152. * @return A String containing the decoded data.153. * @throws IllegalArgumentException If the input is not valid Base64 encoded data.154. */155. public static String decodeString (String s) {156. return new String(decode(s)); }157.158. /**159. * Decodes a byte array from Base64 format and ignores line separators, tabs and blanks. 160. * CR, LF, Tab and Space characters are ignored in the input data.161. * This method is compatible with <code>sun.misc.BASE64Decoder.decodeBuffer(String)</code>. 162. * @param s A Base64 String to be decoded.163. * @return An array containing the decoded data bytes.164. * @throws IllegalArgumentException If the input is not valid Base64 encoded data.165. */166. public static byte[] decodeLines (String s) {167. char[] buf = new char[s.length()+3];168. int p = 0;169. for (int ip = 0; ip < s.length(); ip++) {170. char c = s.charAt(ip);171. if (c != ' ' && c != '\r' && c != '\n' && c != '\t')172. buf[p++] = c; }173. while ((p % 4) != 0)174. buf[p++] = '0';175.176. return decode(buf, 0, p); }177.178. /**179. * Decodes a byte array from Base64 format.180. * No blanks or line breaks are allowed within the Base64 encoded input data.181. * @param s A Base64 String to be decoded.182. * @return An array containing the decoded data bytes.183. * @throws IllegalArgumentException If the input is not valid Base64 encoded data.184. */185. public static byte[] decode (String s) {186. return decode(s.toCharArray()); }187.188. /**189. * Decodes a byte array from Base64 format.190. * No blanks or line breaks are allowed within the Base64 encoded input data.191. * @param in A character array containing the Base64 encoded data.192. * @return An array containing the decoded data bytes.193. * @throws IllegalArgumentException If the input is not valid Base64 encoded data.194. */195. public static byte[] decode (char[] in) {196. return decode(in, 0, in.length); }197.198. /**199. * Decodes a byte array from Base64 format.200. * No blanks or line breaks are allowed within the Base64 encoded input data.201. * @param in A character array containing the Base64 encoded data.202. * @param iOff Offset of the first character in <code>in</code> to be processed.203. * @param iLen Number of characters to process in <code>in</code>, starting at <code>iOff</code>.204. * @return An array containing the decoded data bytes.205. * @throws IllegalArgumentException If the input is not valid Base64 encoded data.206. */207. public static byte[] decode (char[] in, int iOff, int iLen) {208. if (iLen%4 != 0) throw new IllegalArgumentException ("Length of Base64 encoded input string is not a multiple of 4."); 209. while (iLen > 0 && in[iOff+iLen-1] == '=') iLen--;210. int oLen = (iLen*3) / 4;211. byte[] out = new byte[oLen];212. int ip = iOff;213. int iEnd = iOff + iLen;214. int op = 0;215. while (ip < iEnd) {216. int i0 = in[ip++];217. int i1 = in[ip++];218. int i2 = ip < iEnd ? in[ip++] : 'A';219. int i3 = ip < iEnd ? in[ip++] : 'A';220. if (i0 > 127 || i1 > 127 || i2 > 127 || i3 > 127)221. throw new IllegalArgumentException ("Illegal character in Base64 encoded data.");222. int b0 = map2[i0];223. int b1 = map2[i1];224. int b2 = map2[i2];225. int b3 = map2[i3];226. if (b0 < 0 || b1 < 0 || b2 < 0 || b3 < 0)227. throw new IllegalArgumentException ("Illegal character in Base64 encoded data.");228. int o0 = ( b0 <<2) | (b1>>>4);229. int o1 = ((b1 & 0xf)<<4) | (b2>>>2);230. int o2 = ((b2 & 3)<<6) | b3;231. out[op++] = (byte)o0;232. if (op<oLen) out[op++] = (byte)o1;233. if (op<oLen) out[op++] = (byte)o2; }234. return out; }235.236. //Dummy constructor.237. private Base64Coder() {}238.239. } // end class Base64Coder最后,小马还把小DEMO源码放在附件里面,有需要的朋友可以下载下来,共同交流学习,也恳请高人回答下小马在文章注释中提出的问题,谢谢,文章是小马急急忙忙在家写的,在网吧发的,晕...不是我有多用功,这边下雨,讨厌下雨,下雨我就郁闷,来网吧玩的,顺带发下文章,吼吼,该玩的时候死命的玩,该工作的时候死命的工作,年轻时疯狂,老了不后悔,吼吼,加油加油!大家工作,也注意身体健康,嘿嘿,你懂的,不解释...哈哈。
Android拍照剪裁功能实现步骤详解

android:id="@+id/box_pic" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="200dp" android:padding="4dp"> <ImageView
import java.text.SimpleDateFormat; import java.util.Date;
/** * ૡٍᔄ * Created by ਃည on 2016/6/15. */
public class Utils {
/** * ᧣ᦶ௳מᬌڊ * @param context * @param msg
if (requestCode==Cons.SELECT_PIC_BY_TACK_PHOTO && resultCode== RESULT_OK ){// ೌᆙ౮ ۑRESULT_OK= -1 // ᆙᇆᬰᤈۄےૡ startPhotoZoom(Uri.fromFile(tempFile), 150);
}
10 Ⴒےଉᰁᔄ
package spl.example.takepicture;
/** * ଉᰁᔄ * @author ਃည * */
public class Cons {
/** ֵአᆙፘೌᆙ឴ࢶݐᇆ */ public static final int SELECT_PIC_BY_TACK_PHOTO = 1; /** ֵአፘٙӾጱࢶᇆ */ public static final int SELECT_PIC_FROM_ALBUM = 2;
移动应用开发中的图片处理与特效技巧

移动应用开发中的图片处理与特效技巧在移动应用开发中,图片处理与特效的运用是非常重要的一环。
通过合理的图片处理与特效技巧,可以提升用户的使用体验,增加应用的吸引力和竞争力。
本文将探讨一些常见的图片处理和特效技巧,帮助开发者们打造更加出色的移动应用。
一、图片处理技巧1. 图片压缩:移动应用的图片资源通常需要在小尺寸的屏幕上显示,并且需要快速加载。
因此,对图片进行压缩是常见的处理方式。
开发者可以通过减少图片的尺寸和色彩深度来降低图片大小,从而减小应用的体积和加载时间。
同时,利用现代的图片压缩算法,可以保证对图片质量的最小损失。
2. 图片裁剪和缩放:有时候,原始图片并不直接适配应用的需要。
开发者可以通过裁剪或者缩放图片来满足应用的设计要求。
比如,通过裁剪一张长图,可以将其变成一组小图片,并通过滑动效果来展示。
而缩放图片可以使得它们适应不同屏幕尺寸,保证在不同设备上的合适展示效果。
3. 图片格式转换:针对不同的需求,选择合适的图片格式也是一项重要工作。
JPEG格式适用于照片等色彩丰富的图片,可以在保持相对较好的质量的同时,降低文件大小。
而PNG格式则适合保留透明通道,以及对色彩准确性有较高要求的图片。
二、图片特效技巧1. 滤镜效果:滤镜可以为图片增加一定的艺术效果,例如黑白滤镜、怀旧滤镜、复古滤镜等。
移动应用中,开发者可以借助现成的滤镜库或者自行开发滤镜算法,通过调整图片参数和处理方法,给用户带来不同的视觉体验。
2. 图片叠加:通过将多张图片叠加在一起,可以创造出新的效果。
开发者可以利用这一技巧来制作图片拼接、图文相结合的效果等。
例如,在社交应用中,用户可以将自己的头像叠加在不同的主题背景上进行分享。
3. 动态特效:除了静态的图片,动态特效也是移动应用中常见的处理方式。
开发者可以通过添加动画、视频、粒子效果等来增强图片的表现力。
例如,在一款游戏应用中,通过为角色的攻击动作添加火焰特效,可以让玩家感受到更加震撼的攻击视觉效果。
【黑马程序员】Android中如何将图片裁切成三角形并设置阴影

【黑马程序员】Android中如何将图片裁切成三角形并设置阴影Android5.0之后,可以通过轮廓来裁切一个View 。
但是这种方式只能用来裁切矩形、圆形和圆角矩形。
不支持三角形。
所以要想实现这个效果,只能另辟蹊径。
我们知道可以利用PorterDuffXferMode 来进形图片的混合。
所以我们的思路就来了。
分两步:1. 先找一张三角形的图片。
然后采用PorterDuff.Mode.SRC_IN 将原图裁切成三角形图片,设置给一个ImageView 。
2.给这个ImageView 设置三角形的阴影。
首先材料准备:第一步,先用这个三角形的图片把这个美女裁成三角形,并设置个ImageView ,代码如下: 01 02 03 04 05 06 07 08 09 10 11 //先将原图和裁切用的三角形图片准备好Bitmap source = BitmapFactory.decodeResource (getResources (),R.drawable.girl );Bitmap mask = BitmapFactory.decodeResource (getResources (),R.drawable.triangle );//穿件一个空的Bitmap 用来存放合成的图片final Bitmap result = Bitmap.createBitmap (source.getWidth (),source.getHeight (), Config.ARGB_8888);Canvas canvas = new Canvas (result );Paint paint = new Paint (Paint.ANTI_ALIAS_FLAG );12 13 14 15 16 paint.setColor (Color.BLACK );canvas.drawBitmap (mask , 0, 0, paint );paint.setXfermode (new PorterDuffXfermode (Mode.SRC_IN ));canvas.drawBitmap (source , 0, 0, paint );paint.setXfermode (null );iv.setImageBitmap (result );第二步,给这个ImageView 设置一个三角形的阴影,代码如下: 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 iv.setOutlineProvider (new ViewOutlineProvider () {@Overridepublic void getOutline (View view , Outline outline ) { int x = (view .getWidth () - result .getWidth ()) / 2; int y = (view .getHeight () - result .getHeight ()) / 2;Path path = new Path ();path .moveTo (x , y );path .lineTo (x +result .getWidth (), y );path .lineTo (x +result .getWidth ()/2, y +result .getHeight ()); path .lineTo (x , y );path .close ();outline.setConvexPath (path );}});到此,我们完美的实现了这个效果。
【推荐下载】Android实现拍照、选择图片并裁剪图片功能

Android 实现拍照、选择图片并裁剪图片功能2016/10/16 0 一、实现拍照、选择图片并裁剪图片效果按照之前博客的风,首先看下实现效果。
二、uCrop 项目应用想起之前看到的Yalantis/uCrop 效果比较绚,但是研究源码之后发现在定制界面方面还是有一点的限制,于是在它的基础上做了修改Android-Crop,把定制界面独立出来,让用户去自由设置。
下图为使用Android-Crop 实现的模仿微信选择图片并裁剪Demo。
三、实现思路比较简单的选择设备图片裁剪,并将裁剪后的图片保存到指定路径;调用系统拍照,将拍照图片保存在SD 卡,然后裁剪图片并将裁剪后的图片保存在指定路径。
流程图如下所示:四、选择框实现这里通过PopupWindow 来实现,当然也可以根据需求采用其他方式实现。
实现效果如下图所示:1. XML 布局?xml version= 1.0 encoding= utf-8 ? RelativeLayout xmlns:android= schemas.android/apk/res/android android:layout_width= fill_parent android:layout_height= wrap_content android:gravity= center_horizontal android:orientation= vertical LinearLayout android:id= @ id/pop_layout android:layout_width= match_parent android:layout_height= wrap_content android:layout_alignParentBottom= true android:background= #444 android:gravity= center_horizontal android:orientation= vertical Button android:id= @ id/picture_selector_take_photo_btn android:layout_width= match_parent android:layout_height= wrap_content android:layout_marginLeft= 10dip android:layout_marginRight= 10dip android:layout_marginTop= 10dp。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.
Canvas类用来实现绘制.通过组合使用Canva s类的成员函数可以实现随心随欲地绘制图片的任何部分.
Canvas.clipRect:设置显示区域
Canvas.drawBitmap:绘制
例子:
Bitmap b=Bitma pFactory.decodeStream("图片编号", null);//读取图片
...
Canvas c = null;//实例Canvas
c.save();//记录原来的ca nvas状态
c.clipRect(100,100,200,300);//显示从(100,100)到(200,300)的区域(单位:象素)
c.drawBitmap(b,10,0,null); //将阉割过的图片画到(10,0)位置
c.restore();//恢复canva s状态
2.
android 从sdcard 读取图片剪切粘贴
文章分类:移动开发
android 图片编辑时需要从外界(sdcard ,res/.png...,xml)读取图片到画布,其中从sdcard读取图片到画布的过程如下:
public void drawBitMapFromSDcard(String dir) {
if(dir ==null || dir.equals("")){
return ;
}
bitMap = BitmapFactory.decodeFile(dir);
int width = bitMap.getWidth();
int height = bitMap.getHeight();
如果图片像素太大超过手机屏幕大小可以按照手机屏比例进行缩放
if (width > 320 && height > 480) {
int newWidth = 320;
int newHeight = 480;
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
float minScale = Math.min(scaleWidth, scaleHeight);
matrix = new Matrix();
matrix.postScale(minScale, minScale);
bitMap = Bitmap.createBitmap(bitMap, 0, 0, width, height,
matrix, true);
}
显示图片到手机屏幕
mCanvas.drawBitmap(bitMap, 0, 0, mPaint);
invalidate();
(二)图片剪切
在android 画布上对图像进行剪切时,首先选中一块区域,得到所选区域的像素点,然后放到到要粘贴的位置。
剪切代码如下
public int[] getClipRectangePix(RectF rectf, Bitmap bitmap) {
int width = (int) rectf.width();
int height = (int) rectf.height();
int[] clipRectangePix = new int[(width * height)];// ????
int x = (int) rectf.left;
int y = (int) rectf.top;
bitmap.getPixels(clipRectangePix, 0, width, x, y, width, height); // Log.v("pix Color:",""+ clipRectangePix[0] );
return clipRectangePix;
}。