精华内容
下载资源
问答
  • Deepin-TIM、QQ无法加载图片和头像

    千次阅读 2020-03-28 09:46:22
    最近一直用的是ubuntu,发现Deepin-TIM他这个图片和头像加载都出现了异常,聊天的图片无法接收,头像都是原始的那种,聊天图片也一直转圈,很无奈,最后解决方案就是禁用IPV6,完美解决了这个问题。 方法一 sudo ...

    最近一直用的是ubuntu,发现Deepin-TIM他这个图片和头像加载都出现了异常,聊天的图片无法接收,头像都是原始的那种,聊天图片也一直转圈,很无奈,最后解决方案就是禁用IPV6,完美解决了这个问题。

    • 方法一
    sudo vim /etc/default/grub
    找到GRUB_CMDLINE_LINUX_DEFAULT="quiet spalsh"
    改为 GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1 quiet spalsh"
    sudo update-grub
    
    • 方法二
    sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
    sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
    sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=1
    

    然后重启TIM/QQ就发现一切正常了

    展开全文
  • Deepin-TIM、QQ无法加载图片和头像 最近一直用的是ubuntu,发现Deepin-TIM他这个图片和头像加载都出现了异常,聊天的图片无法接收,头像都是原始的那种,聊天图片也一直转圈,很无奈,最后解决方案就是禁用IPV6,...

    Deepin-TIM、QQ无法加载图片和头像

    最近一直用的是ubuntu,发现Deepin-TIM他这个图片和头像加载都出现了异常,聊天的图片无法接收,头像都是原始的那种,聊天图片也一直转圈,很无奈,最后解决方案就是禁用IPV6,完美解决了这个问题。

    方法一
    
    sudo vim /etc/default/grub
    

    找到

    GRUB_CMDLINE_LINUX_DEFAULT="quiet spalsh"
    

    改为

     GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1 quiet spalsh"
    sudo update-grub
    
    方法二
    
    sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
    sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
    sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=1
    

    然后重启TIM/QQ就发现一切正常了

    展开全文
  • 原创作品,允许转载,转载时请... 最近有看到有朋友在讨论QQ头像的裁剪上传是怎么实现的,吼吼,小马也没做过,好奇之下学习下,发现以前项目中有类型的功能,结合官方文档里面的解释,就更好玩了,周末,急急忙忙写的
    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://mzh3344258.blog.51cto.com/1823534/808837

             最近有看到有朋友在讨论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 android.net.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.java  
    22.  * @Package com.xiaoma.piccut.demo  
    23.  * @Description: 图片裁剪功能测试  
    24.  * @author XiaoMa  
    25.  */ 
    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.     @Override 
    36.     public void onCreate(Bundle savedInstanceState) {  
    37.         super.onCreate(savedInstanceState);  
    38.         setContentView(R.layout.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.     @Override 
    64.     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.html  
    116.                          * 我刚看的时候因为太长就认真看,其实是错的,这个里面有用的太多了,所以大家不要认为  
    117.                          * 官方文档太长了就不看了,其实是错的,这个地方小马也错了,必须改正  
    118.                          */  
    119.                         Intent intent = new Intent(  
    120.                                 MediaStore.ACTION_IMAGE_CAPTURE);  
    121.                         //下面这句指定调用相机拍照后的照片存储的路径  
    122.                         intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri  
    123.                                 .fromFile(new File(Environment  
    124.                                         .getExternalStorageDirectory(),  
    125.                                         "xiaoma.jpg")));  
    126.                         startActivityForResult(intent, 2);  
    127.                     }  
    128.                 }).show();  
    129.     }  
    130.  
    131.     @Override 
    132.     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 uri  
    168.      */ 
    169.     public void startPhotoZoom(Uri uri) {  
    170.         /*  
    171.          * 至于下面这个Intent的ACTION是怎么知道的,大家可以看下自己路径下的如下网页  
    172.          * yourself_sdk_path/docs/reference/android/content/Intent.html  
    173.          * 直接在里面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 picdata  
    194.      */  
    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.             photo.compress(Bitmap.CompressFormat.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.  

    下面来看下裁剪中用到的类,大家详细看下头注释:

    1. package com.xiaoma.piccut.demo;  
    2.  
    3.  
    4.  
    5.  
    6. /**  
    7.  * 下面这些注释是下载这个类的时候本来就有的,本来要删除的,但看了下竟然是license,吼吼,  
    8.  * 好东西,留在注释里,以备不时之用,大家有需要加license的可以到下面的网址找哦  
    9.  */ 
    10.  
    11. //EPL, Eclipse Public License, V1.0 or later, http://www.eclipse.org/legal  
    12. //LGPL, GNU Lesser General Public License, V2.1 or later, http://www.gnu.org/licenses/lgpl.html  
    13. //GPL, GNU General Public License, V2 or later, http://www.gnu.org/licenses/gpl.html  
    14. //AL, Apache License, V2.0 or later, http://www.apache.org/licenses  
    15. //BSD, BSD License, http://www.opensource.org/licenses/bsd-license.php  
    16. /**  
    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="http://www.source-code.biz/base64coder/java/">www.source-code.biz/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.java  
    34. * @Package com.xiaoma.piccut.demo  
    35. * @Description: TODO  
    36. * @author XiaoMa  
    37.  */ 
    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 <= 0throw 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 padding  
    129. int oLen = ((iLen+2)/3)*4;         // output length including padding  
    130. 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 != 0throw 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源码放在附件里面,有需要的朋友可以下载下来,共同交流学习,也恳请高人回答下小马在文章注释中提出的问题,谢谢,文章是小马急急忙忙在家写的,在网吧发的,晕...不是我有多用功,这边下雨,讨厌下雨,下雨我就郁闷,来网吧玩的,顺带发下文章,吼吼,该玩的时候死命的玩,该工作的时候死命的工作,年轻时疯狂,老了不后悔,吼吼,加油加油!大家工作,也注意身体健康,嘿嘿,你懂的,不解释...哈哈

    本文出自 “酷_莫名简单、KNothing” 博客,请务必保留此出处http://mzh3344258.blog.51cto.com/1823534/808837

    展开全文
  • Android圆形头像图Circle ImageView

    千次阅读 2015-04-09 15:17:06
    《Android圆形头像图Circle ImageView》 需要处理的原始图(pic): ...现在结合他人的代码加以修改,给出一个以原始图形中心为原点,修剪图片为头像的工具类,此类 可以直接在布局文件中加载使用,比

    《Android圆形头像图Circle ImageView》

    需要处理的原始图(pic):


    使用CircleImageView处理后的图(作为头像):


    现在很多的应用都有设置头像的功能,如QQ、微信、微博等。头像有标准的四方形,也有圆形(如QQ)。现在结合他人的代码加以修改,给出一个以原始图形中心为原点,修剪图片为头像的工具类,此类

    可以直接在布局文件中加载使用,比如:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <zhangphil.circle.CircleImageView
            android:id="@+id/civ"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/pic" />
    
    </RelativeLayout>

    CircleImageView.java的完整源代码:

    package zhangphil.circle;
    
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Bitmap;
    import android.graphics.BitmapShader;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Matrix;
    import android.graphics.Paint;
    import android.graphics.Paint.Align;
    import android.graphics.Rect;
    import android.graphics.RectF;
    import android.graphics.Shader;
    import android.graphics.SweepGradient;
    import android.graphics.drawable.BitmapDrawable;
    import android.graphics.drawable.ColorDrawable;
    import android.graphics.drawable.Drawable;
    import android.net.Uri;
    import android.text.TextPaint;
    import android.util.AttributeSet;
    import android.util.FloatMath;
    import android.widget.ImageView;
    
    /**
     * @author Phil
     *
     */
    public class CircleImageView extends ImageView {
    
    	private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;
    
    	private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
    	private static final int COLORDRAWABLE_DIMENSION = 2;
    
    	// 圆形边框的厚度默认值。
    	// 如果是0,则没有天蓝色渐变的边框。
    	private static final int DEFAULT_BORDER_WIDTH = 20;
    
    	private static final int DEFAULT_BORDER_COLOR = Color.BLACK;
    
    	private final RectF mDrawableRect = new RectF();
    	private final RectF mBorderRect = new RectF();
    
    	private final Matrix mShaderMatrix = new Matrix();
    	private final Paint mBitmapPaint = new Paint();
    	private final Paint mBorderPaint = new Paint();
    
    	private int mBorderColor = DEFAULT_BORDER_COLOR;
    	private int mBorderWidth = DEFAULT_BORDER_WIDTH;
    
    	private Bitmap mBitmap;
    	private BitmapShader mBitmapShader;
    	private int mBitmapWidth;
    	private int mBitmapHeight;
    
    	private float mDrawableRadius;
    	private float mBorderRadius;
    
    	private boolean mReady;
    	private boolean mSetupPending;
    	private final Paint mFlagBackgroundPaint = new Paint();
    	private final TextPaint mFlagTextPaint = new TextPaint();
    	private String mFlagText;
    	private boolean mShowFlag = false;
    	private Rect mFlagTextBounds = new Rect();
    
    	Shader mSweepGradient = null;
    
    	public CircleImageView(Context context) {
    		super(context);
    
    		init();
    	}
    
    	public CircleImageView(Context context, AttributeSet attrs) {
    		this(context, attrs, 0);
    	}
    
    	public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
    		super(context, attrs, defStyle);
    
    		// TypedArray a = context.obtainStyledAttributes(attrs,
    		// R.styleable.CircleImageView, defStyle, 0);
    		//
    		// mBorderWidth =
    		// a.getDimensionPixelSize(R.styleable.CircleImageView_border_width,
    		// DEFAULT_BORDER_WIDTH);
    		// mBorderColor = a.getColor(R.styleable.CircleImageView_border_color,
    		// DEFAULT_BORDER_COLOR);
    		//
    		// a.recycle();
    
    		init();
    	}
    
    	private void init() {
    		super.setScaleType(SCALE_TYPE);
    		mReady = true;
    
    		if (mSetupPending) {
    			setup();
    			mSetupPending = false;
    		}
    	}
    
    	@Override
    	public ScaleType getScaleType() {
    		return SCALE_TYPE;
    	}
    
    	@Override
    	public void setScaleType(ScaleType scaleType) {
    		if (scaleType != SCALE_TYPE) {
    			throw new IllegalArgumentException(String.format(
    					"ScaleType %s not supported.", scaleType));
    		}
    	}
    
    	@Override
    	public void setAdjustViewBounds(boolean adjustViewBounds) {
    		if (adjustViewBounds) {
    			throw new IllegalArgumentException(
    					"adjustViewBounds not supported.");
    		}
    	}
    
    	@Override
    	protected void onDraw(Canvas canvas) {
    		if (getDrawable() == null) {
    			return;
    		}
    
    		canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius,
    				mBitmapPaint);
    		if (mBorderWidth != 0) {
    			canvas.save();
    			canvas.rotate(20, getWidth() / 2, getHeight() / 2);
    			canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius,
    					mBorderPaint);
    			canvas.restore();
    		}
    
    		if (mShowFlag && mFlagText != null) {
    			canvas.drawArc(mBorderRect, 40, 100, false, mFlagBackgroundPaint);
    			mFlagTextPaint.getTextBounds(mFlagText, 0, mFlagText.length(),
    					mFlagTextBounds);
    			canvas.drawText(mFlagText, getWidth() / 2,
    					(3 + FloatMath.cos((float) (Math.PI * 5 / 18)))
    							* getHeight() / 4 + mFlagTextBounds.height() / 3,
    					mFlagTextPaint);
    		}
    
    	}
    
    	@Override
    	protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    		super.onSizeChanged(w, h, oldw, oldh);
    		setup();
    	}
    
    	public int getBorderColor() {
    		return mBorderColor;
    	}
    
    	public void setBorderColor(int borderColor) {
    		if (borderColor == mBorderColor) {
    			return;
    		}
    
    		mBorderColor = borderColor;
    		mBorderPaint.setColor(mBorderColor);
    		invalidate();
    	}
    
    	public int getBorderWidth() {
    		return mBorderWidth;
    	}
    
    	/**
    	 * @param borderWidth
    	 *            圆形的边框厚度。
    	 */
    	public void setBorderWidth(int borderWidth) {
    		if (borderWidth == mBorderWidth) {
    			return;
    		}
    
    		mBorderWidth = borderWidth;
    		setup();
    	}
    
    	@Override
    	public void setImageBitmap(Bitmap bm) {
    		super.setImageBitmap(bm);
    		mBitmap = bm;
    		setup();
    	}
    
    	@Override
    	public void setImageDrawable(Drawable drawable) {
    		super.setImageDrawable(drawable);
    		mBitmap = getBitmapFromDrawable(drawable);
    		setup();
    	}
    
    	@Override
    	public void setImageResource(int resId) {
    		super.setImageResource(resId);
    		mBitmap = getBitmapFromDrawable(getDrawable());
    		setup();
    	}
    
    	@Override
    	public void setImageURI(Uri uri) {
    		super.setImageURI(uri);
    		mBitmap = getBitmapFromDrawable(getDrawable());
    		setup();
    	}
    
    	private Bitmap getBitmapFromDrawable(Drawable drawable) {
    		if (drawable == null) {
    			return null;
    		}
    
    		if (drawable instanceof BitmapDrawable) {
    			return ((BitmapDrawable) drawable).getBitmap();
    		}
    
    		try {
    			Bitmap bitmap;
    
    			if (drawable instanceof ColorDrawable) {
    				bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION,
    						COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
    			} else {
    				bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
    						drawable.getIntrinsicHeight(), BITMAP_CONFIG);
    			}
    
    			Canvas canvas = new Canvas(bitmap);
    			drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    			drawable.draw(canvas);
    			return bitmap;
    		} catch (OutOfMemoryError e) {
    			return null;
    		}
    	}
    
    	private void setup() {
    		if (!mReady) {
    			mSetupPending = true;
    			return;
    		}
    
    		if (mBitmap == null) {
    			return;
    		}
    
    		mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP,
    				Shader.TileMode.CLAMP);
    
    		mBitmapPaint.setAntiAlias(true);
    		mBitmapPaint.setShader(mBitmapShader);
    
    		mBorderPaint.setStyle(Paint.Style.STROKE);
    		mBorderPaint.setAntiAlias(true);
    		mBorderPaint.setColor(mBorderColor);
    		mBorderPaint.setStrokeWidth(mBorderWidth);
    
    		mBitmapHeight = mBitmap.getHeight();
    		mBitmapWidth = mBitmap.getWidth();
    
    		mBorderRect.set(0, 0, getWidth(), getHeight());
    		mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2,
    				(mBorderRect.width() - mBorderWidth) / 2);
    
    		mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width()
    				- mBorderWidth, mBorderRect.height() - mBorderWidth);
    		mDrawableRadius = Math.min(mDrawableRect.height() / 2,
    				mDrawableRect.width() / 2);
    
    		mFlagBackgroundPaint.setColor(Color.BLACK & 0x66FFFFFF);
    		mFlagBackgroundPaint.setFlags(TextPaint.ANTI_ALIAS_FLAG);
    
    		mFlagTextPaint.setFlags(TextPaint.ANTI_ALIAS_FLAG);
    		mFlagTextPaint.setTextAlign(Align.CENTER);
    		mFlagTextPaint.setColor(Color.WHITE);
    		mFlagTextPaint
    				.setTextSize(getResources().getDisplayMetrics().density * 18);
    
    		mSweepGradient = new SweepGradient(getWidth() / 2, getHeight() / 2,
    				new int[] { Color.rgb(255, 255, 255), Color.rgb(1, 209, 255) },
    				null);
    
    		mBorderPaint.setShader(mSweepGradient);
    
    		updateShaderMatrix();
    		invalidate();
    	}
    
    	private void updateShaderMatrix() {
    		float scale;
    		float dx = 0;
    		float dy = 0;
    
    		mShaderMatrix.set(null);
    
    		if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width()
    				* mBitmapHeight) {
    			scale = mDrawableRect.height() / (float) mBitmapHeight;
    			dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;
    		} else {
    			scale = mDrawableRect.width() / (float) mBitmapWidth;
    			dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;
    		}
    
    		mShaderMatrix.setScale(scale, scale);
    		mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth,
    				(int) (dy + 0.5f) + mBorderWidth);
    
    		mBitmapShader.setLocalMatrix(mShaderMatrix);
    	}
    
    	public void setShowFlag(boolean show) {
    		mShowFlag = show;
    		invalidate();
    	}
    
    	public void setFlagText(String text) {
    		mFlagText = text;
    		invalidate();
    	}
    }

    

    展开全文
  • 注:此上传本版为压缩资源版,原始版100M以上(实在对不住大家,上传大小限制,没办法了) http://download.csdn.net/source/2713712(游戏源码part1) http://download.csdn.net/source/2714542(地图生成器源码)
  • 注:此上传本版为压缩资源版,原始版100M以上(实在对不住大家,上传大小限制,没办法呀)。 另外:在res里面带有地图生成器的运行程序,源码已经上传了。 http://download.csdn.net/source/2713649(游戏源码part2...
  • 五合一收款码在线生成,40个模板支持微信支付,支付宝支付,手机QQ支付,京东钱包,百度钱包,PayPal五合一收款,将其二维码合并为一个二维码,无需操作费,支持qq头像,昵称判断(HTML单页版多模板免安装) ...
  • 五合一收款码在线生成微信小程序版,35个模板支持微信支付,支付宝支付,手机QQ支付,京东钱包,百度钱包,五合一收款,将其二维码合并为一个二维码,无需手续费,支持qq头像,昵称判断(HTML单页版多模板免安装)...
  • 五合一收款码在线生成,35个模板支持微信支付,支付宝支付,手机QQ支付,京东钱包,百度钱包,五合一收款,将其二维码合并为一个二维码,无需手续费,支持qq头像,昵称判断(HTML单页版多模板免安装) 演示站 腾讯云...
  • My LOGO

    2019-08-03 05:28:53
    先来看一下原来的LOGO,应用在QQ头像上。 没有了源文件,只能按照这张依葫芦画瓢了。首先准备工具,Adobe Flash CS3。因为Flash里面的线条工具比较好用。 把QQ头像的截图复制到新建的场景里,放大。可以看到...
  • 再一次尝试将QQ空间的头像保存到本地的过程中,发现每次执行那段代码都要有大约将近20s左右的延时。 这个延时对于正常来说是不可忍受的。尝试解决之。首先尝试用浏览器直接打开头像地址,发现没有任何延时,瞬间即...
  • 两步:我的网站-源码

    2021-02-13 16:13:03
    上次修改比较仓促,此把以前需要原来的地方的地方都转移到设置里面,试图不麻烦大家修改原始代码。至于其中一些设置我会在后面详细说明。 2.修改了文章背景图片 文章背景图片全部换成非常清晰的图片,同时网页背景...
  • 很多软件中(比如QQ)用到了许多圆形图片,作为用户头像等等,原始图片往往是方形的,那么怎么样将方形的图片显示成圆形呢? 一种方法是当背景为固定纯色的时候,可以使用同背景色的边框遮罩,这种方法适用性小,这里...
  • OA系统的简单分析流程

    千次阅读 2017-06-26 20:03:03
    权限管理,批量添加,批量删除,批量修改,ef,.mvc,jqueryOA项目oa: 办公自动化 office auto作用:方便使用系统办公,避免使用原始的纸质化办公核心功能块:个人中心: 登陆后可以进行修改个人信息, 实现更换...
  • 本博客的原始皮肤来自:http://www.cnblogs.com/libaoheng/archive/2012/03/19/2406836.html  2013年9月16日20:17:14 ...点我头像,进入QQ空间,鼠标悬浮有效果   长评论按钮       2013年9月16日19...
  • 个人网站项目,前台包括博客,代码库,文件下载,消息,登录注册等功能,后台包括上传文件,博客,代码,编辑,删除文章,查看,修改个人资料及邮箱,头像等功能。 PC端网址:demo.hemingsheng.cn,移动端网址: :/...
  • 如:公众号名称,原始帐号ID,公众号头像及二维码(此处头像可以下载保存到自己的服务器中),公众号类型等。 8.成功完成以上步骤后,可以根据自己的需求调用微信相关API获取数据。 a.获取粉丝信息持久化到数据库...
  • 你可以编辑单个联系人信息,包括姓名、头像、电话、地址、网址、IM、备注等。 该工具尽可能支持各种VCF文件,但是由于各厂家、各系统的VCF格式都有略微差别,该工具可能并不支持某种特定的VCF文件。如果你遇到不...
  • 老虎通讯录1.2版(VCF文件编辑器)

    热门讨论 2013-03-09 10:55:12
    你可以编辑单个联系人信息,包括姓名、头像、电话、地址、网址、IM、备注等。 该工具尽可能支持各种VCF文件,但是由于各厂家、各系统的VCF格式都有略微差别,该工具可能并不支持某种特定的VCF文件。如果你遇到不...
  • Q:没有得到原始文章url / 提示链接已经过期? A:微信屏蔽此接口,请在临时链接有效期内保存文章内容。 Q:获取文章只能10篇? A:是的,仅显示最近10条群发。 Q:使用的是python 2 还是 3? A:都支持,若出错,请报...
  • 版权归暗夜、暗夜(qq310880211)及地图制作辅助者所有,以暗夜制作的未加密魔兽地图为基础修改后的地图,应保留原始版权说明,或者注明地图辅助制作:暗夜、暗夜(qq310880211)及地图制作辅助者。对未注明暗夜版权的...

空空如也

空空如也

1 2 3
收藏数 43
精华内容 17
关键字:

qq头像原始