初学JAVA项目(三、槑图秀秀)

  • Java槑图秀秀
  • 前言
  • 一、图像处理
  • 二、技术难点
    • 1.开发过程
    • 2.卷积(CNN)
    • 2.均衡化滤镜
    • 2.其他滤镜
  • 总结

Java槑图秀秀


前言

本次项目学习目标:
主要通过以项目为导向学习数组、图像算法


一、图像处理

百度百科:图像算法是指对图像进行处理所用的的算法。包括对图像去噪、图像变换、图像分析、图像压缩、图像增强、图像模糊处理等。

界面截图:

二、技术难点

1.开发过程

原有框架的基础上添加实现。如下功能

2.卷积(CNN)

人工智能里的卷积神经网络(CNN)是最近今年最火的图像技术之一。
     卷积其实就是近视眼——不能精确地看清每个像素,而是把它和周围的像素模模糊糊地看作一团,就好像得了近视一样。例如下面左图,卷积之后就变成了右图:

如何实现这种效果呢?以卷积半径等于1为例,也就是跟周围距离为1的其他像素混作一团,具体的做法是:对于新图像中位于r行和c列,即(r,c)的像素,RGB三个颜色通道的值不是直接复制原图像中的像素,而要取原图像中从(r-1,c-1)至(r+1,c+1)一共9个像素的平均值(向下取整)。
     例如原图像为下图的话:

加粗显示的(1,2)位置的像素,卷积前是(32,67,12);按照卷积半径1进行卷积后,RGB三个通道的值就会变为:
                         R = (84+74+16+66+32+95+28+47+31)/9 = 52
                         G = (22+38+17+53+67+65+49+21+41)/9 = 41
                         B = (99+69+18+88+12+35+31+94+51)/9 = 55
     也就是黄色框圈起来的9个像素取平均值。

代码如下:

   /**                                                                                                                     * 卷积                                                                                                                   */                                                                                                                     public GImage convolution(GImage source) {                                                                              int[][] pixelArray = source.getPixelArray();                                                                        int height = pixelArray.length;                                                                                     int width = pixelArray[0].length;                                                                                   int[][] newPixelArray = new int[height][width];                                                                     for (int y = 0; y < height; y++) {                                                                                  for (int x = 0; x < width; x++) {                                                                               newPixelArray[y][x] = newPixel(pixelArray, x, y);                                                           }                                                                                                               }                                                                                                                   return new GImage(newPixelArray);                                                                                   }                                                                                                                       /**                                                                                                                     * 计算某个像素点的卷积像素                                                                                                         * CONVOLUTION_RADIUS 卷积半径                                                                                              *                                                                                                                      * @param pixelArray 原始像素数组                                                                                             * @param x          二维数组索引                                                                                             * @param y          一维数组索引                                                                                             * @return 卷积后新的像素                                                                                                      */                                                                                                                     private int newPixel(int[][] pixelArray, int x, int y) {                                                                int height = pixelArray.length;                                                                                     int width = pixelArray[0].length;                                                                                   //设置三个值分别存储r,g,b的特征值,一定要在循环内部进行初始化0,这样才能每次有不同的值                                                                     int resultOfR = 0;                                                                                                  int resultOfG = 0;                                                                                                  int resultOfB = 0;                                                                                                  // 计算卷积时,使用的像素点数                                                                                                    int count = 0;                                                                                                      // 当前像素点的卷积范围                                                                                                       int xMin = Math.max(x - CONVOLUTION_RADIUS, 0);                                                                     int xMax = Math.min(x + CONVOLUTION_RADIUS, width - 1);                                                             int yMin = Math.max(y - CONVOLUTION_RADIUS, 0);                                                                     int yMax = Math.min(y + CONVOLUTION_RADIUS, height - 1);                                                            for (int i = yMin; i <= yMax; i++) {                                                                                for (int j = xMin; j <= xMax; j++) {                                                                            resultOfR += GImage.getRed(pixelArray[i][j]);                                                               resultOfG += GImage.getGreen(pixelArray[i][j]);                                                             resultOfB += GImage.getBlue(pixelArray[i][j]);                                                              count++;                                                                                                    }                                                                                                               }                                                                                                                   return GImage.createRGBPixel(resultOfR / count, resultOfG / count, resultOfB / count);                              }

2.均衡化滤镜

均衡化是一种主要应用于灰度图片的技术,可以增强画面的对比度。

均衡做法其实也很简单:
1、计算每个像素的亮度
2、根据亮度调整每个像素的颜色

均衡计算亮度

像素的亮度是根据RGB通道值计算的,新建一个接口类 PSAlgorithmsInterface,实现代码如下:

public interface PSAlgorithmsInterface {public static final int CONVOLUTION_RADIUS = 1;public GImage flipHorizontal(GImage source);public GImage rotateCounterclockwise(GImage source);public GImage rotateClockwise(GImage source);public GImage greenScreen(GImage source);public GImage negative(GImage source);public GImage crop(GImage source, int cropX, int cropY, int cropWidth, int cropHeight);public GImage convolution(GImage source);/* 计算图片亮度 */public default int computeLuminosity(int r, int g, int b) {return GMath.round(0.299 * r + 0.587 * g + 0.114 * b);}
}

然后可以像下面这样直接使用:

int luminosity = computeLuminosity(red, green, blue);

这个函数算出的是一个0-255之间的整数,代表该像素RGB所对应的亮度。

调整颜色

调整颜色时,R、G、B三个通道会被调整为相等的值,都等于     255 * 亮度小于等于当前像素的像素个数 / 整张图片的像素数量    ,小数结果向下取整即可。

举个例子。假如有一张20x10的图片,总共200个像素。其中亮度为0的有三个像素,亮度为1的有五个像素,亮度为2的有零个像素,亮度为3的有两个像素。那么

  • 对于亮度为0的三个像素,整张图片亮度小于等于0的也是这三个像素,所以调整过后R=G=B=255*3/200=3,也就是RGB三个通道都改为3就可以了。
  • 对于亮度为1的五个像素,整张图片亮度小于等于1的有3+5=8个像素,所以调整过后R=G=B=255*8/200=10,也就是RGB三个通道都改为10就可以了。
  • 原图没有亮度为2的像素,直接跳过。
  • 对于亮度为3的两个像素,整张图片亮度小于等于2的有3+5+0+2=10个像素,所以调整过后R=G=B=255*10/200=12,也就是RGB三个通道都改为12就可以了。
  • 以此类推。

代码如下:

/**                                                                                                   * 均衡化                                                                                                */                                                                                                   public GImage equalization(GImage source) {                                                           int[][] pixelArray = source.getPixelArray();                                                      int equalHeight = pixelArray.length;                                                              int equalWidth = pixelArray[0].length;                                                            int allPixel = equalHeight * equalWidth;                                                          int[] a = new int[256];                                                                           for (int row = 0; row < equalHeight; row++) {                                                     for (int col = 0; col < equalWidth; col++) {                                                  int pixel = pixelArray[row][col];                                                         int r = GImage.getRed(pixel);                                                             int g = GImage.getGreen(pixel);                                                           int b = GImage.getBlue(pixel);                                                            int luminosity = computeLuminosity(r, g, b);                                              //遍历luminosity ,每出现一次相同的值就+1                                                              a[luminosity]++;                                                                          }                                                                                             }                                                                                                 for (int i = 0; i < 255; i++) {                                                                   a[i + 1] = a[i] + a[i + 1];                                                                   a[i] = 255 * a[i] / allPixel;                                                                 }                                                                                                 for (int row = 0; row < equalHeight; row++) {                                                     for (int col = 0; col < equalWidth; col++) {                                                  int pixel = pixelArray[row][col];                                                         int r = GImage.getRed(pixel);                                                             int g = GImage.getGreen(pixel);                                                           int b = GImage.getBlue(pixel);                                                            int Result = computeLuminosity(r, g, b);                                                  int newPixel = GImage.createRGBPixel(a[Result], a[Result], a[Result]);                    pixelArray[row][col] = newPixel;                                                          }                                                                                             }                                                                                                 // TODO                                                                                           return new GImage(pixelArray);                                                                    }                                                                                                     

2.其他滤镜

大致的方法都一样,知识其中的核心算法有些许不同,参考其他博客实现大部分滤镜效果:

  1. Java图像处理:灰度、二值化、浮雕、去色、反向、怀旧、放大镜等

    https://blog.csdn.net/m0_51673807/article/details/110588972

  2. 【图像处理】中的“滤镜算法”:灰度、黑白、反向、去色、单色、高斯模糊、怀旧、连环画
    https://blog.csdn.net/weixin_42346564/article/details/95909449

总结

通过这个项目主要学习数组、图像算法等基础概念,做项目的过程发现自己经常卡在算法方面,懂算法原理但是不懂如何在代码中实现它,大部分都是参考别人的代码完成,所以基础知识改补还是要补,先从Java基础视频开始看起把,订个目标:项目之余每天三个小时视频+实操学习。

全部代码(待改进~)

https://gitee.com/liaodemo/ps

部分方法代码:

import acm.graphics.*;import java.awt.*;public class PSAlgorithms implements PSAlgorithmsInterface {//逆时针public GImage rotateCounterclockwise(GImage source) {/************************************************* 旋转前,旧图片的信息************************************************/int[][] oldPixelArray = source.getPixelArray();     // 旧图片数组int oldHeight = oldPixelArray.length;               // 旧图片高度int oldWidth = oldPixelArray[0].length;             // 旧图片宽度/************************************************* 旋转前,旧图片的信息************************************************/int newHeight = oldWidth;                               // 新图片高度等于旧图片宽度int newWidth = oldHeight;                               // 新图片宽度等于旧图片高度int[][] newPixelArray = new int[newHeight][newWidth];   // 为新图片新建一个数组,行数是newHeight,列数是newWidth/************************************************* 新旧数组的像素对应关系************************************************/for (int yNew = 0; yNew < newHeight; yNew++) {      //新图片高度大于0,yNew加1for (int xNew = 0; xNew < newWidth; xNew++) {   //新图片宽度大于0,xNew加1int yOld = xNew;                            //逆旋转前后旧图片宽(x)等于给新图片高(y)int xOld = oldWidth - yNew - 1;             //逆旋转前后新图片高(x)为旧图的宽减去yNew-1newPixelArray[yNew][xNew] = oldPixelArray[yOld][xOld];}}return new GImage(newPixelArray);}public GImage rotateClockwise(GImage source) {/************************************************* 旋转前,旧图片的信息************************************************/int[][] oldPixelArray = source.getPixelArray();     // 旧图片数组int oldHeight = oldPixelArray.length;               // 旧图片高度int oldWidth = oldPixelArray[0].length;             // 旧图片宽度/************************************************* 旋转前,旧图片的信息************************************************/int newHeight = oldWidth;                               // 新图片高度等于旧图片宽度int newWidth = oldHeight;                               // 新图片宽度等于旧图片高度int[][] newPixelArray = new int[newHeight][newWidth];   // 为新图片新建一个数组,行数是newHeight,列数是newWidth/************************************************* 新旧数组的像素对应关系************************************************/for (int yNew = 0; yNew < newHeight; yNew++) {for (int xNew = 0; xNew < newWidth; xNew++) {int yOld = oldHeight - xNew - 1;int xOld = yNew;newPixelArray[yNew][xNew] = oldPixelArray[yOld][xOld];}}return new GImage(newPixelArray);}//水平翻转public GImage flipHorizontal(GImage source) {/************************************************* 旋转前,旧图片的信息************************************************/int[][] oldPixelArray = source.getPixelArray();        // 旧图片数组int oldHeight = oldPixelArray[0].length;               // 旧图片高度int oldWidth = oldPixelArray.length;                   // 旧图片宽度/************************************************* 旋转前,旧图片的信息************************************************/int newHeight = oldWidth;                               // 新图片高度等于旧图片宽度int newWidth = oldHeight;                               // 新图片宽度等于旧图片高度int[][] newPixelArray = new int[newHeight][newWidth];   // 为新图片新建一个数组,行数是newHeight,列数是newWidth/************************************************* 新旧数组的像素对应关系************************************************/for (int yNew = 0; yNew < newHeight; yNew++) {for (int xNew = 0; xNew < newWidth; xNew++) {int yOld = yNew;int xOld = oldHeight - xNew - 1;newPixelArray[yNew][xNew] = oldPixelArray[yOld][xOld];}}return new GImage(newPixelArray);}/*** 二值化*/public GImage bastardization(GImage source) {int[][] pixelArray = source.getPixelArray();int inverseHeight = pixelArray.length;int inverseWidth = pixelArray[0].length;for (int row = 0; row < inverseHeight; row++) {for (int col = 0; col < inverseWidth; col++) {int pixel = pixelArray[row][col];int r = GImage.getRed(pixel);int g = GImage.getGreen(pixel);int b = GImage.getBlue(pixel);int gray = (int) (0.299 * r + 0.587 * g + 0.114 * b);if (gray > 170) {gray = 255;} else {gray = 0;}int newPixel = GImage.createRGBPixel(gray, gray, gray);pixelArray[row][col] = newPixel;}}return new GImage(pixelArray);}/*** 反相*/public GImage negative(GImage source) {int[][] pixelArray = source.getPixelArray();int inverseHeight = pixelArray.length;int inverseWidth = pixelArray[0].length;for (int row = 0; row < inverseHeight; row++) {for (int col = 0; col < inverseWidth; col++) {int pixel = pixelArray[row][col];int r = GImage.getRed(pixel);int g = GImage.getGreen(pixel);int b = GImage.getBlue(pixel);//255减去rgb三原色int newPixel = GImage.createRGBPixel(255 - r, 255 - g, 255 - b);pixelArray[row][col] = newPixel;}}return new GImage(pixelArray);}/*** 绿布*/public GImage greenScreen(GImage source) {int[][] pixelArray = source.getPixelArray();int inverseHeight = pixelArray.length;int inverseWidth = pixelArray[0].length;//创建一个透明像素int transparentPixel = GImage.createRGBPixel(0, 0, 0, 0);for (int row = 0; row < inverseHeight; row++) {for (int col = 0; col < inverseWidth; col++) {int pixel = pixelArray[row][col];int r = GImage.getRed(pixel);int g = GImage.getGreen(pixel);int b = GImage.getBlue(pixel);//像素的绿色(G)至少是红色(R)和蓝色(B)中较大值的两倍,就把这个像素当作绿色if (g >= Math.max(r, b) * 2) {pixelArray[row][col] = transparentPixel;}}}// TODOreturn new GImage(pixelArray);}/*** 卷积*/public GImage convolution(GImage source) {int[][] pixelArray = source.getPixelArray();int height = pixelArray.length;int width = pixelArray[0].length;int[][] newPixelArray = new int[height][width];for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {newPixelArray[y][x] = newPixel(pixelArray, x, y);}}return new GImage(newPixelArray);}/*** 计算某个像素点的卷积像素* CONVOLUTION_RADIUS 卷积半径** @param pixelArray 原始像素数组* @param x          二维数组索引* @param y          一维数组索引* @return 卷积后新的像素*/private int newPixel(int[][] pixelArray, int x, int y) {int height = pixelArray.length;int width = pixelArray[0].length;//设置三个值分别存储r,g,b的特征值,一定要在循环内部进行初始化0,这样才能每次有不同的值int resultOfR = 0;int resultOfG = 0;int resultOfB = 0;// 计算卷积时,使用的像素点数int count = 0;// 当前像素点的卷积范围int xMin = Math.max(x - CONVOLUTION_RADIUS, 0);int xMax = Math.min(x + CONVOLUTION_RADIUS, width - 1);int yMin = Math.max(y - CONVOLUTION_RADIUS, 0);int yMax = Math.min(y + CONVOLUTION_RADIUS, height - 1);for (int i = yMin; i <= yMax; i++) {for (int j = xMin; j <= xMax; j++) {resultOfR += GImage.getRed(pixelArray[i][j]);resultOfG += GImage.getGreen(pixelArray[i][j]);resultOfB += GImage.getBlue(pixelArray[i][j]);count++;}}return GImage.createRGBPixel(resultOfR / count, resultOfG / count, resultOfB / count);}/*** 裁剪图片,裁剪后仅保留选区内容,其他全部删掉** @param source     要被裁剪的原始图片* @param cropX      选区左上角的x坐标* @param cropY      选区左上角的y坐标* @param cropWidth  选区的宽度* @param cropHeight 选区的高度* @return 裁剪后的图片*/public GImage crop(GImage source, int cropX, int cropY, int cropWidth, int cropHeight) {int[][] oldPixelArray = source.getPixelArray();int[][] newPixelArray = new int[cropHeight][cropWidth];for (int X = 0; X < cropWidth; X++) {for (int Y = 0; Y < cropHeight; Y++) {int yOld = cropY + Y;int xOld = cropX + X;newPixelArray[Y][X] = oldPixelArray[yOld][xOld];}}return new GImage(newPixelArray);}/*** 均衡化*/public GImage equalization(GImage source) {int[][] pixelArray = source.getPixelArray();int equalHeight = pixelArray.length;int equalWidth = pixelArray[0].length;int allPixel = equalHeight * equalWidth;int[] a = new int[256];for (int row = 0; row < equalHeight; row++) {for (int col = 0; col < equalWidth; col++) {int pixel = pixelArray[row][col];int r = GImage.getRed(pixel);int g = GImage.getGreen(pixel);int b = GImage.getBlue(pixel);int luminosity = computeLuminosity(r, g, b);//遍历luminosity ,每出现一次相同的值就+1a[luminosity]++;}}for (int i = 0; i < 255; i++) {a[i + 1] = a[i] + a[i + 1];a[i] = 255 * a[i] / allPixel;}for (int row = 0; row < equalHeight; row++) {for (int col = 0; col < equalWidth; col++) {int pixel = pixelArray[row][col];int r = GImage.getRed(pixel);int g = GImage.getGreen(pixel);int b = GImage.getBlue(pixel);int Result = computeLuminosity(r, g, b);int newPixel = GImage.createRGBPixel(a[Result], a[Result], a[Result]);pixelArray[row][col] = newPixel;}}// TODOreturn new GImage(pixelArray);}/*** 利用怀旧滤镜公式实现图像处理*/public GImage nostalgia(GImage source) {int[][] pixelArray = source.getPixelArray();int inverseHeight = pixelArray.length;int inverseWidth = pixelArray[0].length;for (int row = 0; row < inverseHeight; row++) {for (int col = 0; col < inverseWidth; col++) {int pixel = pixelArray[row][col];int r = GImage.getRed(pixel);int g = GImage.getGreen(pixel);int b = GImage.getBlue(pixel);int[] rgb = new int[3];rgb[0] = (int) (0.393 * r + 0.769 * g + 0.189 * b);rgb[1] = (int) (0.349 * r + 0.686 * g + 0.168 * b);rgb[2] = (int) (0.272 * r + 0.534 * g + 0.131 * b);for (int m = 0; m < 3; m++) {if (rgb[m] > 255)rgb[m] = 255;}int newPixel = GImage.createRGBPixel(rgb[0], rgb[1], rgb[2]);pixelArray[row][col] = newPixel;}}return new GImage(pixelArray);}/*** 去色*/public GImage decolor(GImage source) {int[][] pixelArray = source.getPixelArray();int inverseHeight = pixelArray.length;int inverseWidth = pixelArray[0].length;for (int row = 0; row < inverseHeight; row++) {for (int col = 0; col < inverseWidth; col++) {int pixel = pixelArray[row][col];int r = GImage.getRed(pixel);int g = GImage.getGreen(pixel);int b = GImage.getBlue(pixel);//将像素点的RGB值统一设置为其中的最大值int avg = (Math.max(Math.max(r, b), g) + Math.max(Math.min(r, b), g)) / 2;int newPixel = GImage.createRGBPixel(avg, avg, avg);pixelArray[row][col] = newPixel;}}return new GImage(pixelArray);}/*** 灰度* 灰度处理是通过转灰度的算法改变像素点的RGB值后进行绘制.*/public GImage gray(GImage source) {int[][] pixelArray = source.getPixelArray();int inverseHeight = pixelArray.length;int inverseWidth = pixelArray[0].length;for (int row = 0; row < inverseHeight; row++) {for (int col = 0; col < inverseWidth; col++) {int pixel = pixelArray[row][col];int r = GImage.getRed(pixel);int g = GImage.getGreen(pixel);int b = GImage.getBlue(pixel);//这里使用的RGB转灰度算法为Gray = R0.299 + G0.587 + B*0.114int gray = (int) (0.299 * r + 0.587 * g + 0.114 * b);int newPixel = GImage.createRGBPixel(gray, gray, gray);pixelArray[row][col] = newPixel;}}return new GImage(pixelArray);}/*** 利熔炉滤镜公式实现图像处理*/public GImage furnace(GImage source) {int[][] pixelArray = source.getPixelArray();int inverseHeight = pixelArray.length;int inverseWidth = pixelArray[0].length;for (int row = 0; row < inverseHeight; row++) {for (int col = 0; col < inverseWidth; col++) {int pixel = pixelArray[row][col];int r = GImage.getRed(pixel);int g = GImage.getGreen(pixel);int b = GImage.getBlue(pixel);int[] rgb = new int[3];rgb[0] =  r * 128 / (g + b + 1);rgb[1] =  g * 128 / (r + b + 1);rgb[2] =  b * 128 / (g + r + 1);int newPixel = GImage.createRGBPixel(rgb[0], rgb[1], rgb[2]);pixelArray[row][col] = newPixel;}}return new GImage(pixelArray);}
}

初学JAVA项目(三、槑图秀秀)相关推荐

  1. 初学JAVA项目(五、取名背后的秘密)

    初学JAVA项目(五.取名背后的秘密) Java 新生儿取名背后的数据可视化 前言 一.取名背后的秘密 二.关于一些问题的学习 1.Java中如何进行函数式编程? 1.1 什么是函数式编程? 1.2 ...

  2. java sns_SNS:美图秀秀的社交化变革

    上个月,美图秀秀的新版本进行了大规模改动,宣布进军社交方向,转型工具+社交平台.最新版本直接将社区放在首页,不需要再做点击跳转.同时,兼顾用户原来的使用习惯,将美图秀秀的工具模块保留在首页上半部. 吴 ...

  3. 初学Java(三)——学习准备

    网上有很多教程资源,如果想要什么资源可以先试试从B站搜,B站可以搜到很多类型的资源,包括编程教程.英语教程.软件使用教程等都有. 以下是网上搜集的Java学习路线教程,学习Java选择其中一个教程跟着 ...

  4. Android JNI实现Java与C/C++互相调用,以及so库的生成和调用(JNI方式调用美图秀秀so)

    前言 关于Android Studio如何继承JNI开发环境,请阅读上一篇博文 Android CMake集成JNI开发环境本篇博文将结合实例分别讲解Android中Java如何调用C/C++的方法, ...

  5. eclipse 如何关联git_作为一名初学Java者 如何做简单的Java项目

    作为一名初学Java者而言,如何做简单的Java项目?想要更有效率的学习Java技术,理论中穿插项目练习很有必要.但项目练习要在你掌握了一定的技术之后才能做的,它是用来加深你对技术理解的. 就拿Jav ...

  6. Android App开发实战项目之模仿美图秀秀的抠图工具(附源码和演示视频 简单易懂 可直接使用)

    需要图片集和源码请点赞关注收藏后评论区留言~~~ 所谓抠图神器,就是从一副图片中扣出用户想要的某块区域 一.需求描述 美图的修图功能如此强大,离不开专业的图片加工技术,抠图便是其中重要的一项功能.在A ...

  7. MyEclipse将Java项目打包成jar文件的三种方法

    2019独角兽企业重金招聘Python工程师标准>>> 方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 "MANIFEST.MF", 由于 ...

  8. myeclipse打包java文件_MyEclipse将Java项目打包成jar文件的三种方法

    方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 "MANIFEST.MF", 由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFE ...

  9. 基于AI的计算机视觉识别在Java项目中的使用(三) —— 搭建基于Docker的深度学习训练环境

    深度学习在哪里? 我们已然生活在数字时代,一天24小时我们被数字包围.我们生活中的方方面面都在使用数字来表达.传递.存储.我们无时无刻不在接收数字信息,而又无时无刻不在生产数字信息. 在数字世界中,可 ...

  10. java实现美图秀秀的照片拼接功能(照片数量任意)

    每次想拼接照片的时候是不是会发现,最多只能拼接9张照片.那如何实现多张照片的拼接呢!因为本小编想把和女朋友的聊天记录拼接在一起,发现美图秀秀只能拼接9张照片,为了解决这个问题小编我写了这段java代码 ...

最新文章

  1. fj怎么样_一朝中毒普拉多,万能解药FJ酷路泽
  2. 阿里云消息队列python_41. Python Queue 多进程的消息队列 PIPE
  3. 基于FPGA NIOS处理器的数码音乐相册
  4. 百度关键词排名查询源码_章丘百度霸屏总部,关键词排名腾沃云
  5. SpringBoot+Thyemleaf报错Template might not exist or might not be accessible
  6. 意大利不禁止华为;13 款 5G 手机时间表公布;亚马逊 CEO 遭威胁 | 极客头条
  7. 【QA】哈工大张伟男:任务型对话系统
  8. JavaScript之节点的创建、替换、删除、插入
  9. java8 新特性之 -- lamdba 表达式 -- Optional类 --遍历 Map List
  10. 王长君:城市交通智能管控20年发展反思
  11. 我个人中意的VS2017/VS2019插件,推荐给大家(#^.^#)
  12. 区块链底层架构概览:第一原则框架
  13. JS 模拟手机页面文件的下拉刷新
  14. 【无标题】adsa da das
  15. JavaScript动态操作网页思维导图
  16. 查看并修改Linux主机名命令hostname
  17. 1.Hadoop简介——为什么要使用Hadoop?什么是Hadoop?Hadoop有什么作用?
  18. 有了这几个webp转换工具,快速完成图片转换工作
  19. Android 开发 打开手电筒
  20. Android Studio报错:Incompatible types. Required:android.app.ActionBar及Android如何隐藏系统默认标题栏

热门文章

  1. QQ企业邮箱发送邮件
  2. 模拟人生畅玩版android,模拟人生畅玩版
  3. matlab中count()怎么用,count(1)这里面的1是什么意思
  4. 美国佐治亚理工计算机专业,世界大学排名之:美国佐治亚理工学院
  5. HDFS--Secondary NameNode
  6. argparse模块中的参数action、dest使用
  7. 一图秒懂!“天使投资、VC、PE、A轮、B轮、C轮融资”的关系
  8. Vid2Vid多图详解
  9. 激活函数(activation function)的种类与应用
  10. ARM嵌入式实验 熟悉PROTEUS电子仿真软件的使用(LPC2138)