在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩);质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手机拍照都能达到3M左右了,尺寸压缩一般可用于生成缩略图。
两种方法都实装在了我的项目中,结果却发现在质量压缩的模块中,本来1.9M的图片压缩后反而变成3M多了,很是奇怪,再做了进一步调查终于知道原因了。下面这个博客说的比较清晰:

android图片压缩总结

总结来看,图片有三种存在形式:硬盘上时是file,网络传输时是stream,内存中是stream或bitmap,所谓的质量压缩,它其实只能实现对file的影响,你可以把一个file转成bitmap再转成file,或者直接将一个bitmap转成file时,这个最终的file是被压缩过的,但是中间的bitmap并没有被压缩(或者说几乎没有被压缩,我不确定),因为bigmap在内存中的大小是按像素计算的,也就是width * height,对于质量压缩,并不会改变图片的像素,所以就算质量被压缩了,但是bitmap在内存的占有率还是没变小,但你做成file时,它确实变小了;

而尺寸压缩由于是减小了图片的像素,所以它直接对bitmap产生了影响,当然最终的file也是相对的变小了;

最后把自己总结的工具类贴出来:

[java] view plaincopy
  1. import java.io.ByteArrayInputStream;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.File;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import android.graphics.Bitmap;
  8. import android.graphics.Bitmap.Config;
  9. import android.graphics.BitmapFactory;
  10. /**
  11. * Image compress factory class
  12. *
  13. * @author
  14. *
  15. */
  16. public class ImageFactory {
  17. /**
  18. * Get bitmap from specified image path
  19. *
  20. * @param imgPath
  21. * @return
  22. */
  23. public Bitmap getBitmap(String imgPath) {
  24. // Get bitmap through image path
  25. BitmapFactory.Options newOpts = new BitmapFactory.Options();
  26. newOpts.inJustDecodeBounds = false;
  27. newOpts.inPurgeable = true;
  28. newOpts.inInputShareable = true;
  29. // Do not compress
  30. newOpts.inSampleSize = 1;
  31. newOpts.inPreferredConfig = Config.RGB_565;
  32. return BitmapFactory.decodeFile(imgPath, newOpts);
  33. }
  34. /**
  35. * Store bitmap into specified image path
  36. *
  37. * @param bitmap
  38. * @param outPath
  39. * @throws FileNotFoundException
  40. */
  41. public void storeImage(Bitmap bitmap, String outPath) throws FileNotFoundException {
  42. FileOutputStream os = new FileOutputStream(outPath);
  43. bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
  44. }
  45. /**
  46. * Compress image by pixel, this will modify image width/height.
  47. * Used to get thumbnail
  48. *
  49. * @param imgPath image path
  50. * @param pixelW target pixel of width
  51. * @param pixelH target pixel of height
  52. * @return
  53. */
  54. public Bitmap ratio(String imgPath, float pixelW, float pixelH) {
  55. BitmapFactory.Options newOpts = new BitmapFactory.Options();
  56. // 开始读入图片,此时把options.inJustDecodeBounds 设回true,即只读边不读内容
  57. newOpts.inJustDecodeBounds = true;
  58. newOpts.inPreferredConfig = Config.RGB_565;
  59. // Get bitmap info, but notice that bitmap is null now
  60. Bitmap bitmap = BitmapFactory.decodeFile(imgPath,newOpts);
  61. newOpts.inJustDecodeBounds = false;
  62. int w = newOpts.outWidth;
  63. int h = newOpts.outHeight;
  64. // 想要缩放的目标尺寸
  65. float hh = pixelH;// 设置高度为240f时,可以明显看到图片缩小了
  66. float ww = pixelW;// 设置宽度为120f,可以明显看到图片缩小了
  67. // 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
  68. int be = 1;//be=1表示不缩放
  69. if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放
  70. be = (int) (newOpts.outWidth / ww);
  71. } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放
  72. be = (int) (newOpts.outHeight / hh);
  73. }
  74. if (be <= 0) be = 1;
  75. newOpts.inSampleSize = be;//设置缩放比例
  76. // 开始压缩图片,注意此时已经把options.inJustDecodeBounds 设回false了
  77. bitmap = BitmapFactory.decodeFile(imgPath, newOpts);
  78. // 压缩好比例大小后再进行质量压缩
  79. //        return compress(bitmap, maxSize); // 这里再进行质量压缩的意义不大,反而耗资源,删除
  80. return bitmap;
  81. }
  82. /**
  83. * Compress image by size, this will modify image width/height.
  84. * Used to get thumbnail
  85. *
  86. * @param image
  87. * @param pixelW target pixel of width
  88. * @param pixelH target pixel of height
  89. * @return
  90. */
  91. public Bitmap ratio(Bitmap image, float pixelW, float pixelH) {
  92. ByteArrayOutputStream os = new ByteArrayOutputStream();
  93. image.compress(Bitmap.CompressFormat.JPEG, 100, os);
  94. if( os.toByteArray().length / 1024>1024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出
  95. os.reset();//重置baos即清空baos
  96. image.compress(Bitmap.CompressFormat.JPEG, 50, os);//这里压缩50%,把压缩后的数据存放到baos中
  97. }
  98. ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());
  99. BitmapFactory.Options newOpts = new BitmapFactory.Options();
  100. //开始读入图片,此时把options.inJustDecodeBounds 设回true了
  101. newOpts.inJustDecodeBounds = true;
  102. newOpts.inPreferredConfig = Config.RGB_565;
  103. Bitmap bitmap = BitmapFactory.decodeStream(is, null, newOpts);
  104. newOpts.inJustDecodeBounds = false;
  105. int w = newOpts.outWidth;
  106. int h = newOpts.outHeight;
  107. float hh = pixelH;// 设置高度为240f时,可以明显看到图片缩小了
  108. float ww = pixelW;// 设置宽度为120f,可以明显看到图片缩小了
  109. //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
  110. int be = 1;//be=1表示不缩放
  111. if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放
  112. be = (int) (newOpts.outWidth / ww);
  113. } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放
  114. be = (int) (newOpts.outHeight / hh);
  115. }
  116. if (be <= 0) be = 1;
  117. newOpts.inSampleSize = be;//设置缩放比例
  118. //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
  119. is = new ByteArrayInputStream(os.toByteArray());
  120. bitmap = BitmapFactory.decodeStream(is, null, newOpts);
  121. //压缩好比例大小后再进行质量压缩
  122. //      return compress(bitmap, maxSize); // 这里再进行质量压缩的意义不大,反而耗资源,删除
  123. return bitmap;
  124. }
  125. /**
  126. * Compress by quality,  and generate image to the path specified
  127. *
  128. * @param image
  129. * @param outPath
  130. * @param maxSize target will be compressed to be smaller than this size.(kb)
  131. * @throws IOException
  132. */
  133. public void compressAndGenImage(Bitmap image, String outPath, int maxSize) throws IOException {
  134. ByteArrayOutputStream os = new ByteArrayOutputStream();
  135. // scale
  136. int options = 100;
  137. // Store the bitmap into output stream(no compress)
  138. image.compress(Bitmap.CompressFormat.JPEG, options, os);
  139. // Compress by loop
  140. while ( os.toByteArray().length / 1024 > maxSize) {
  141. // Clean up os
  142. os.reset();
  143. // interval 10
  144. options -= 10;
  145. image.compress(Bitmap.CompressFormat.JPEG, options, os);
  146. }
  147. // Generate compressed image file
  148. FileOutputStream fos = new FileOutputStream(outPath);
  149. fos.write(os.toByteArray());
  150. fos.flush();
  151. fos.close();
  152. }
  153. /**
  154. * Compress by quality,  and generate image to the path specified
  155. *
  156. * @param imgPath
  157. * @param outPath
  158. * @param maxSize target will be compressed to be smaller than this size.(kb)
  159. * @param needsDelete Whether delete original file after compress
  160. * @throws IOException
  161. */
  162. public void compressAndGenImage(String imgPath, String outPath, int maxSize, boolean needsDelete) throws IOException {
  163. compressAndGenImage(getBitmap(imgPath), outPath, maxSize);
  164. // Delete original file
  165. if (needsDelete) {
  166. File file = new File (imgPath);
  167. if (file.exists()) {
  168. file.delete();
  169. }
  170. }
  171. }
  172. /**
  173. * Ratio and generate thumb to the path specified
  174. *
  175. * @param image
  176. * @param outPath
  177. * @param pixelW target pixel of width
  178. * @param pixelH target pixel of height
  179. * @throws FileNotFoundException
  180. */
  181. public void ratioAndGenThumb(Bitmap image, String outPath, float pixelW, float pixelH) throws FileNotFoundException {
  182. Bitmap bitmap = ratio(image, pixelW, pixelH);
  183. storeImage( bitmap, outPath);
  184. }
  185. /**
  186. * Ratio and generate thumb to the path specified
  187. *
  188. * @param image
  189. * @param outPath
  190. * @param pixelW target pixel of width
  191. * @param pixelH target pixel of height
  192. * @param needsDelete Whether delete original file after compress
  193. * @throws FileNotFoundException
  194. */
  195. public void ratioAndGenThumb(String imgPath, String outPath, float pixelW, float pixelH, boolean needsDelete) throws FileNotFoundException {
  196. Bitmap bitmap = ratio(imgPath, pixelW, pixelH);
  197. storeImage( bitmap, outPath);
  198. // Delete original file
  199. if (needsDelete) {
  200. File file = new File (imgPath);
  201. if (file.exists()) {
  202. file.delete();
  203. }
  204. }
  205. }
  206. }
延伸阅读

android图片压缩总结

一.图片的存在形式

1.文件形式(即以二进制形式存在于硬盘上)
2.流的形式(即以二进制形式存在于内存中)
3.Bitmap形式
这三种形式的区别: 文件形式和流的形式对图片体积大小并没有影响,也就是说,如果你手机SD卡上的如果是100K,那么通过流的形式读到内存中,也一定是占100K的内存,注意是流的形式,不是Bitmap的形式,当图片以Bitmap的形式存在时,其占用的内存会瞬间变大, 我试过500K文件形式的图片加载到内存,以Bitmap形式存在时,占用内存将近10M,当然这个增大的倍数并不是固定的
检测图片三种形式大小的方法:
文件形式: file.length()
流的形式: 讲图片文件读到内存输入流中,看它的byte数
Bitmap:    bitmap.getByteCount()

二.常见的压缩方式

public static void compressBmpToFile(Bitmap bmp,File file){  ByteArrayOutputStream baos = new ByteArrayOutputStream();  int options = 80;//个人喜欢从80开始,  bmp.compress(Bitmap.CompressFormat.JPEG, options, baos);  while (baos.toByteArray().length / 1024 > 100) {   baos.reset();  options -= 10;  bmp.compress(Bitmap.CompressFormat.JPEG, options, baos);  }  try {  FileOutputStream fos = new FileOutputStream(file);  fos.write(baos.toByteArray());  fos.flush();  fos.close();  } catch (Exception e) {  e.printStackTrace();  }  }  

方法说明: 该方法是压缩图片的质量, 注意它不会减少图片的像素,比方说, 你的图片是300K的, 1280*700像素的, 经过该方法压缩后, File形式的图片是在100以下, 以方便上传服务器, 但是你BitmapFactory.decodeFile到内存中,变成Bitmap时,它的像素仍然是1280*700, 计算图片像素的方法是 bitmap.getWidth()和bitmap.getHeight(), 图片是由像素组成的, 每个像素又包含什么呢? 熟悉PS的人知道, 图片是有色相,明度和饱和度构成的. 
该方法的官方文档也解释说, 它会让图片重新构造, 但是有可能图像的位深(即色深)和每个像素的透明度会变化,JPEG onlysupports opaque(不透明), 也就是说以jpeg格式压缩后, 原来图片中透明的元素将消失.所以这种格式很可能造成失真

既然它是改变了图片的显示质量, 达到了对File形式的图片进行压缩, 图片的像素没有改变的话, 那重新读取经过压缩的file为Bitmap时, 它占用的内存并不会少.(不相信的可以试试)

因为: bitmap.getByteCount() 是计算它的像素所占用的内存, 请看官方解释: Returns the number of bytes used to store this bitmap's pixels.

2.   将图片从本地读到内存时,进行压缩 ,即图片从File形式变为Bitmap形式

       特点: 通过设置采样率, 减少图片的像素, 达到对内存中的Bitmap进行压缩
       先看一个方法: 该方法是对内存中的Bitmap进行质量上的压缩, 由上面的理论可以得出该方法是无效的, 而且也是没有必要的,因为你已经将它读到内存中了,再压缩多此一举, 尽管在获取系统相册图片时,某些手机会直接返回一个Bitmap,但是这种情况下, 返回的Bitmap都是经过压缩的, 它不可能直接返回一个原声的Bitmap形式的图片, 后果可想而知
private Bitmap compressBmpFromBmp(Bitmap image) {  ByteArrayOutputStream baos = new ByteArrayOutputStream();  int options = 100;  image.compress(Bitmap.CompressFormat.JPEG, 100, baos);  while (baos.toByteArray().length / 1024 > 100) {   baos.reset();  options -= 10;  image.compress(Bitmap.CompressFormat.JPEG, options, baos);  }  ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());  Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);  return bitmap;  }  

view plaincopy

再看一个方法:
    private Bitmap compressImageFromFile(String srcPath) {  BitmapFactory.Options newOpts = new BitmapFactory.Options();  newOpts.inJustDecodeBounds = true;//只读边,不读内容  Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);  newOpts.inJustDecodeBounds = false;  int w = newOpts.outWidth;  int h = newOpts.outHeight;  float hh = 800f;//  float ww = 480f;//  int be = 1;  if (w > h && w > ww) {  be = (int) (newOpts.outWidth / ww);  } else if (w < h && h > hh) {  be = (int) (newOpts.outHeight / hh);  }  if (be <= 0)  be = 1;  newOpts.inSampleSize = be;//设置采样率  newOpts.inPreferredConfig = Config.ARGB_8888;//该模式是默认的,可不设  newOpts.inPurgeable = true;// 同时设置才会有效  newOpts.inInputShareable = true;//。当系统内存不够时候图片自动被回收  bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
//      return compressBmpFromBmp(bitmap);//原来的方法调用了这个方法企图进行二次压缩  //其实是无效的,大家尽管尝试  return bitmap;  }  

方法说明: 该方法就是对Bitmap形式的图片进行压缩, 也就是通过设置采样率, 减少Bitmap的像素, 从而减少了它所占用的内存
分享个按照图片尺寸压缩:
[java] view plaincopy
  1. public static void compressPicture(String srcPath, String desPath) {
  2. FileOutputStream fos = null;
  3. BitmapFactory.Options op = new BitmapFactory.Options();
  4. // 开始读入图片,此时把options.inJustDecodeBounds 设回true了
  5. op.inJustDecodeBounds = true;
  6. Bitmap bitmap = BitmapFactory.decodeFile(srcPath, op);
  7. op.inJustDecodeBounds = false;
  8. // 缩放图片的尺寸
  9. float w = op.outWidth;
  10. float h = op.outHeight;
  11. float hh = 1024f;//
  12. float ww = 1024f;//
  13. // 最长宽度或高度1024
  14. float be = 1.0f;
  15. if (w > h && w > ww) {
  16. be = (float) (w / ww);
  17. } else if (w < h && h > hh) {
  18. be = (float) (h / hh);
  19. }
  20. if (be <= 0) {
  21. be = 1.0f;
  22. }
  23. op.inSampleSize = (int) be;// 设置缩放比例,这个数字越大,图片大小越小.
  24. // 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
  25. bitmap = BitmapFactory.decodeFile(srcPath, op);
  26. int desWidth = (int) (w / be);
  27. int desHeight = (int) (h / be);
  28. bitmap = Bitmap.createScaledBitmap(bitmap, desWidth, desHeight, true);
  29. try {
  30. fos = new FileOutputStream(desPath);
  31. if (bitmap != null) {
  32. bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
  33. }
  34. } catch (FileNotFoundException e) {
  35. e.printStackTrace();
  36. }
  37. }

需要注意两个问题:

一、调用getDrawingCache()前先要测量,否则的话得到的bitmap为null,这个我在OnCreate()、OnStart()、OnResume()方法里都试验过。

二、当调用bitmap.compress(CompressFormat.JPEG, 100, fos);保存为图片时发现图片背景为黑色,如下图:

这时只需要改成用png保存就可以了,bitmap.compress(CompressFormat.PNG, 100, fos);,如下图:

在实际开发中,有时候我们需求将文件转换为字符串,然后作为参数进行上传。

必备工具类图片bitmap转成字符串string与String字符串转换为bitmap图片格式

[java] view plaincopy
  1. import android.graphics.Bitmap;
  2. import android.graphics.BitmapFactory;
  3. import android.util.Base64;
  4. import java.io.ByteArrayOutputStream;
  5. /**
  6. *
  7. *
  8. * 功能描述:Android开发之常用必备工具类图片bitmap转成字符串string与String字符串转换为bitmap图片格式
  9. */
  10. public class BitmapAndStringUtils {
  11. /**
  12. * 图片转成string
  13. *
  14. * @param bitmap
  15. * @return
  16. */
  17. public static String convertIconToString(Bitmap bitmap)
  18. {
  19. ByteArrayOutputStream baos = new ByteArrayOutputStream();// outputstream
  20. bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
  21. byte[] appicon = baos.toByteArray();// 转为byte数组
  22. return Base64.encodeToString(appicon, Base64.DEFAULT);
  23. }
  24. /**
  25. * string转成bitmap
  26. *
  27. * @param st
  28. */
  29. public static Bitmap convertStringToIcon(String st)
  30. {
  31. // OutputStream out;
  32. Bitmap bitmap = null;
  33. try
  34. {
  35. // out = new FileOutputStream("/sdcard/aa.jpg");
  36. byte[] bitmapArray;
  37. bitmapArray = Base64.decode(st, Base64.DEFAULT);
  38. bitmap =
  39. BitmapFactory.decodeByteArray(bitmapArray, 0,
  40. bitmapArray.length);
  41. // bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
  42. return bitmap;
  43. }
  44. catch (Exception e)
  45. {
  46. return null;
  47. }
  48. }
  49. }

如果你的图片是File文件,可以用下面代码:

[java] view plaincopy
  1. /**
  2. * 图片文件转换为指定编码的字符串
  3. *
  4. * @param imgFile  图片文件
  5. */
  6. public static String file2String(File imgFile) {
  7. InputStream in = null;
  8. byte[] data = null;
  9. //读取图片字节数组
  10. try{
  11. in = new FileInputStream(imgFile);
  12. data = new byte[in.available()];
  13. in.read(data);
  14. in.close();
  15. } catch (IOException e){
  16. e.printStackTrace();
  17. }
  18. //对字节数组Base64编码
  19. BASE64Encoder encoder = new BASE64Encoder();
  20. String result = encoder.encode(data);
  21. return result;//返回Base64编码过的字节数组字符串
  22. }

Android图片压缩(质量压缩和尺寸压缩)Bitmap转成字符串上传相关推荐

  1. 【jquery】通过降低图片的质量(或尺寸)压缩图片大小

    生产上图片太大除了用户体验不好,上传等待时间过长,还可能会引发用户缓存丢失,导致必要参数缺失请求失败,或者超时引起的请求失败,查找资料,原理是经过一系列的转化过程file文件=>base64=& ...

  2. android中的图片选择器,实现微信发布朋友圈多图选择上传功能

    本片文章是根据项目要求的思路去学习其他的博主改良的思路,思路会有雷同,但是该文确实属于本人原文创作,参考链接会在文章最后展示(啊啊啊啊啊,好官方....) 先说一下项目的功能要求,类似于QQ和微信在举 ...

  3. Android 电子签名,手写签名案列实现方法,并上传网页显示(base64)!

    最近说项目可能会用到一个电子签名,不需要识别的那种,只是一个单纯手写签名,然后以base64的格式提供给前端web页面.其实挺简单的,自定义一个手写view就上线了.Android 电子签名,手写签名 ...

  4. java实现图片合成gif图——输出到具体路径或流数据上传

    一.多图片转gif 转存到输出流 /*** 多图片转gif 转存到输出流** @param imageList* @param os* @throws IOException*/private sta ...

  5. 个人界面 头像 图片选择(相册,拍照)--如何调用系统的相册,裁剪并且上传

    ##需求:个人界面的,个人头像图片的切换 方式一:点击开始切换头像的pop–相册选择 二:这里有两种方式,从相册选择和直接拍照,假设现在是从相册选择选择头像 *我在pop确定的点击方法中写了一个方法- ...

  6. android过滤文件删除,Android Studio Git 过滤(忽略)和移除不必要上传的文件

    1.过滤不需要上传的文件 Android studio 项目中有文件.gitignore文件 内部例如:/.idea/ /.gradle/ /.settings/ /build/ .gitignore ...

  7. Android 图片选择和拍照(剪辑)及压缩问题 工具类

    图片选择和拍照在开发过程中,会遇到不少坑: 1.版本4.4以后选择图片后不会返回绝对路径,但返回Uri,要再查询一次 2.去剪辑时,设置了true的话直接返回bitmap,可能会很占内存,有些机子会挂 ...

  8. 余额 微信钱包图片_微信红包技巧:关闭这个功能,不上传身份证也能正常使用!...

    先点击"论人生吧",再点击"关注",这样您就可以免费收到我们的最新内容了,每天都会有更新,完全是免费订阅,请放心关注.本文转自网络,著作权属归原创者所有.如有侵 ...

  9. 性能优化之图片压缩(质量压缩、尺寸压缩)

    前言 作为开发者的我们,经常会做一些上传图片和和保存图片啦 但是由于一些图片非常大,我们在上传或者保存的时候会占用大量的网络资源和本地资源,那么我们需要做的就是对图片就行压缩.以下介绍常见的两种压缩方 ...

最新文章

  1. 涨姿势,Java中New一个对象是个怎么样的过程?
  2. 智能合约的核心思想、语法重点、编程模式、示例、规范及架构
  3. Math.Round()——面试题小结
  4. python是一种语言吗-Python是一种什么样的编程语言?解释?编译?汇编?机械?...
  5. 学习速率 learning rate
  6. netcore dapper mysql_.NET Core Dapper操作mysql数据库
  7. SpringBoot中使用thymeleaf时ajax请求不能回显消息
  8. plsql(轻量版)_基本语法
  9. could not change product header data even after switching to change mode
  10. Kubernetes集群(概念篇)
  11. 就算忘了自己也忘不了你
  12. ARM处理器是有益补充
  13. Python 源程序的基本概念
  14. Flash遮罩之溜光字制作二
  15. matlab数字转换罗马数字,罗马数字(1到1000) 1到1000的叠加是多少
  16. 淘客返利机器人,淘宝,拼多多,京东三合一查券返利机器人搭建教程
  17. 常见英文语法错误案例分享
  18. 转载文章-【工具】10分钟快速搭建属于自己的文档网站-来自掘金
  19. 2566420-12-8,TCO-PEG3-alcohol羟基允许发生额外反应以进一步衍生化合物
  20. MySQL字段名获取

热门文章

  1. 路由器WDS实际案例
  2. C# 事件中委托方法的Lambda简洁写法用及作用域
  3. 计算机科学与技术考研人工智能,人工智能考研考什么
  4. 如何清空微信浏览器缓存
  5. 兔子繁殖问题-C语言
  6. 常州长华过滤材料携PTFE膜材料莅临2022生物发酵展,共谱发酵行业新篇章
  7. HTML 前端学习(4)—— CSS 属性相关
  8. 文件备份怎么弄,怎么备份电脑文件?
  9. 在Fedora中全自动签名英伟达驱动内核模块以支持安全启动(Secure Boot)
  10. Cocos2d-x单机游戏防八门神器修改数据