在上一个版本:java画图程序_图片用字母画出来_源码发布 基础上,增加了图片同比例缩放,使得大像素图片可以很好地显示画在Notepad++中。

项目结构:

运行效果1:

原图:http://images.cnblogs.com/cnblogs_com/hongten/356471/o_imagehandler_result1.png

运行效果2:

原图:http://images.cnblogs.com/cnblogs_com/hongten/356471/o_imagehandler_result2.png

===============================================

源码部分:

===============================================

/imageHandler/src/com/b510/image/client/Client.java

  1. /**
  2. *
  3. */
  4. package com.b510.image.client;
  5.  
  6. import java.io.File;
  7.  
  8. import com.b510.image.common.Common;
  9. import com.b510.image.util.ImageUtil;
  10. import com.b510.image.util.ScaledImageUtil;
  11. import com.b510.image.util.TextUtil;
  12.  
  13. /**
  14. * This project is a tool for processing the image. <br>Including TWO functions :
  15. * <li>Color image to converted black and white picture.
  16. * <li>Imitating the original image to paint into the TXT file with alphabets.
  17. * You can change the code according to your requirement.
  18. *
  19. * @author Hongten
  20. * @mail hongtenzone@foxmail.com
  21. * @created Jul 23, 2014
  22. */
  23. public class Client {
  24.  
  25. public static String SCALED_IMAGE = Common.SCALED + Common.FULL_STOP + ScaledImageUtil.getPostfix(Common.ORIGINAL);
  26.  
  27. public static void main(String[] args) {
  28. //colorImage2BWPic();
  29. painting(Common.ORIGINAL, SCALED_IMAGE, 1);
  30. // remoteImageHandler("E:/images/ipad/photo"); //NOTE: Provider your folder path, which includ some pictures
  31. }
  32.  
  33. /**
  34. * Continuously review images
  35. * @param remotePath Other folder path(Including pictures)
  36. */
  37. private static void remoteImageHandler(String remotePath) {
  38. File file = new File(remotePath);
  39. File[] fileList = file.listFiles();
  40. for (int i = 0; i < fileList.length; i++) {
  41. if(fileList[i].isFile()){
  42. String originalImagePath = fileList[i].getAbsolutePath();
  43. System.out.println("Processing ... " + originalImagePath);
  44. SCALED_IMAGE = Common.SCALED + Common.FULL_STOP + ScaledImageUtil.getPostfix(originalImagePath);
  45. painting(originalImagePath, SCALED_IMAGE, 1);
  46. }
  47. try {
  48. Thread.sleep(4000); // every four seconds
  49. } catch (InterruptedException e) {
  50. e.printStackTrace();
  51. }
  52. }
  53. }
  54.  
  55. private static void painting(String originalImagePath, String scalImagepath, int scaled) {
  56. ScaledImageUtil.scaledImage(originalImagePath, scaled, scalImagepath);
  57. double[][] result = ImageUtil.getImageGRB(scalImagepath);
  58. StringBuffer stringBuffer = ImageUtil.getCanvas(result);
  59. TextUtil.write2File(stringBuffer);
  60. }
  61.  
  62. /**
  63. * Color image to converted black and white picture.
  64. */
  65. private static void colorImage2BWPic() {
  66. File input = new File(Common.ORIGINAL_IMAGE);
  67. File out = new File(Common.PROCESSED_IMAGE);
  68. ImageUtil.colorImage2BlackAndWhitePicture(input, out);
  69. }
  70. }

/imageHandler/src/com/b510/image/common/Common.java

  1. /**
  2. *
  3. */
  4. package com.b510.image.common;
  5.  
  6. /**
  7. * @author Hongten
  8. * @created Jul 23, 2014
  9. */
  10. public class Common {
  11.  
  12. public static final String PATH = "src/com/b510/image/resources/";
  13.  
  14. public static final String ORIGINAL = PATH + "original.jpg";
  15. public static final String SCALED = PATH + "scaled";
  16.  
  17. public static final String ORIGINAL_IMAGE = PATH + "original_image.png";
  18. public static final String PROCESSED_IMAGE = PATH + "processed_image.png";
  19.  
  20. public static final String OUTPUT_TXT = PATH + "output.txt";
  21.  
  22. public static final String PROCESSED_SUCCESS = "Processed successfully...";
  23. public static final String PROCESS_ERROR = "Processing encounters error!";
  24.  
  25. public static final String R = "R";
  26. public static final String A = "A";
  27. public static final String X = "X";
  28. public static final String M = "M";
  29. public static final String W = "W";
  30. public static final String H = "H";
  31. public static final String E = "E";
  32. public static final String J = "J";
  33. public static final String L = "L";
  34. public static final String C = "C";
  35. public static final String V = "V";
  36. public static final String Z = "Z";
  37. public static final String Q = "Q";
  38. public static final String T = "T";
  39. public static final String r = "r";
  40. public static final String s = "s";
  41. public static final String w = "w";
  42. public static final String u = "u";
  43. public static final String l = "l";
  44. public static final String i = "i";
  45. public static final String e = "e";
  46. public static final String m = "m";
  47. public static final String a = "a";
  48. public static final String COMMA = ",";
  49. public static final String FULL_STOP = ".";
  50. public static final String BLANK = " ";
  51.  
  52. public static final String NEW_LINE = "\n";
  53. }

/imageHandler/src/com/b510/image/util/ImageUtil.java

  1. /**
  2. *
  3. */
  4. package com.b510.image.util;
  5.  
  6. import java.awt.Image;
  7. import java.awt.color.ColorSpace;
  8. import java.awt.image.BufferedImage;
  9. import java.awt.image.ColorConvertOp;
  10. import java.io.File;
  11. import java.io.FileOutputStream;
  12. import java.io.IOException;
  13.  
  14. import javax.imageio.ImageIO;
  15.  
  16. import com.b510.image.common.Common;
  17. import com.sun.image.codec.jpeg.JPEGCodec;
  18. import com.sun.image.codec.jpeg.JPEGImageEncoder;
  19.  
  20. /**
  21. * @author Hongten
  22. * @created Jul 23, 2014
  23. */
  24. public class ImageUtil {
  25.  
  26. private static int height = 0;
  27. private static int width = 0;
  28.  
  29. /**
  30. * Color image is converted to black and white picture.
  31. * @param input
  32. * @param out
  33. */
  34. public static void colorImage2BlackAndWhitePicture(File input, File out) {
  35. try {
  36. Image image = ImageIO.read(input);
  37. int srcH = image.getHeight(null);
  38. int srcW = image.getWidth(null);
  39. BufferedImage bufferedImage = new BufferedImage(srcW, srcH, BufferedImage.TYPE_3BYTE_BGR);
  40. bufferedImage.getGraphics().drawImage(image, 0, 0, srcW, srcH, null);
  41. bufferedImage = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null).filter(bufferedImage, null);
  42. FileOutputStream fos = new FileOutputStream(out);
  43. JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
  44. encoder.encode(bufferedImage);
  45. fos.close();
  46. System.out.println(Common.PROCESSED_SUCCESS);
  47. } catch (Exception e) {
  48. throw new IllegalStateException(Common.PROCESS_ERROR, e);
  49. }
  50. }
  51.  
  52. /**
  53. * Get the image(*.jpg, *.png.etc) GRB value
  54. * @param filePath the original image path
  55. * @return
  56. */
  57. public static double[][] getImageGRB(String filePath) {
  58. File file = new File(filePath);
  59. double[][] result = null;
  60. if (!file.exists()) {
  61. return result;
  62. }
  63. try {
  64. BufferedImage bufImg = readImage(file);
  65. result = new double[height][width];
  66. for (int y = 0; y < height; y++) {
  67. for (int x = 0; x < width; x++) {
  68. double temp = Double.valueOf(bufImg.getRGB(x, y) & 0xFFFFFF);
  69. result[y][x] = Math.floor(Math.cbrt(temp));
  70. }
  71. }
  72. } catch (IOException e) {
  73. e.printStackTrace();
  74. }
  75. return result;
  76. }
  77.  
  78. /**
  79. * Read the original image to convert BufferedImage
  80. * @param file Original image path
  81. * @return
  82. * @see BufferedImage
  83. * @throws IOException
  84. */
  85. private static BufferedImage readImage(File file) throws IOException {
  86. BufferedImage bufImg = ImageIO.read(file);
  87. height = bufImg.getHeight();
  88. width = bufImg.getWidth();
  89. return bufImg;
  90. }
  91.  
  92. /**
  93. * Get the canvas, which is made up of alphabets.
  94. * @param result
  95. * @return
  96. */
  97. public static StringBuffer getCanvas(double[][] result) {
  98. StringBuffer stringBuffer = new StringBuffer();
  99. for (int y = 0; y < height; y++) {
  100. for (int x = 0; x < width; x++) {
  101. fullBlank(result, stringBuffer, y, x);
  102. }
  103. stringBuffer.append(Common.NEW_LINE);
  104. }
  105. return new StringBuffer(stringBuffer.substring(0, stringBuffer.length() - 1));
  106. }
  107.  
  108. /**
  109. * Full blank
  110. * @param result
  111. * @param stringBuffer
  112. * @param y
  113. * @param x
  114. */
  115. private static void fullBlank(double[][] result, StringBuffer stringBuffer, int y, int x) {
  116. if (result[y][x] > 0.0 && result[y][x] < 168.0) {
  117. fullBlackColor(result, stringBuffer, y, x);
  118. } else if (result[y][x] >= 168.0 && result[y][x] < 212.0) {
  119. fullGreyColor(result, stringBuffer, y, x);
  120. } else {
  121. fullWhiteColor(result, stringBuffer, y, x);
  122. }
  123. }
  124.  
  125. /**
  126. * Full black color, and you can change the alphabet if you need.
  127. * @param result
  128. * @param stringBuffer
  129. * @param y
  130. * @param x
  131. */
  132. private static void fullBlackColor(double[][] result, StringBuffer stringBuffer, int y, int x) {
  133. if (result[y][x] > 0.0 && result[y][x] < 25.0) {
  134. stringBuffer.append(Common.R);
  135. } else if (result[y][x] >= 25.0 && result[y][x] < 50.0) {
  136. stringBuffer.append(Common.R);
  137. } else if (result[y][x] >= 50.0 && result[y][x] < 75.0) {
  138. stringBuffer.append(Common.A);
  139. } else if (result[y][x] >= 75.0 && result[y][x] < 100.0) {
  140. stringBuffer.append(Common.X);
  141. } else if (result[y][x] >= 100.0 && result[y][x] < 125.0) {
  142. stringBuffer.append(Common.R);
  143. } else if (result[y][x] >= 125.0 && result[y][x] < 150.0) {
  144. stringBuffer.append(Common.A);
  145. } else if (result[y][x] >= 150.0 && result[y][x] < 154.0) {
  146. stringBuffer.append(Common.X);
  147. } else if (result[y][x] >= 154.0 && result[y][x] < 158.0) {
  148. stringBuffer.append(Common.M);
  149. } else if (result[y][x] >= 158.0 && result[y][x] < 162.0) {
  150. stringBuffer.append(Common.W);
  151. } else if (result[y][x] >= 162.0 && result[y][x] < 168.0) {
  152. stringBuffer.append(Common.M);
  153. }
  154. }
  155.  
  156. /**
  157. * Full grey color
  158. * @param result
  159. * @param stringBuffer
  160. * @param y
  161. * @param x
  162. */
  163. private static void fullGreyColor(double[][] result, StringBuffer stringBuffer, int y, int x) {
  164. if (result[y][x] >= 168.0 && result[y][x] < 172.0) {
  165. stringBuffer.append(Common.H);
  166. } else if (result[y][x] >= 172.0 && result[y][x] < 176.0) {
  167. stringBuffer.append(Common.E);
  168. } else if (result[y][x] >= 176.0 && result[y][x] < 180.0) {
  169. stringBuffer.append(Common.H);
  170. } else if (result[y][x] >= 180.0 && result[y][x] < 184.0) {
  171. stringBuffer.append(Common.H);
  172. } else if (result[y][x] >= 184.0 && result[y][x] < 188.0) {
  173. stringBuffer.append(Common.J);
  174. } else if (result[y][x] >= 188.0 && result[y][x] < 192.0) {
  175. stringBuffer.append(Common.L);
  176. } else if (result[y][x] >= 192.0 && result[y][x] < 196.0) {
  177. stringBuffer.append(Common.C);
  178. } else if (result[y][x] >= 196.0 && result[y][x] < 200.0) {
  179. stringBuffer.append(Common.V);
  180. } else if (result[y][x] >= 200.0 && result[y][x] < 204.0) {
  181. stringBuffer.append(Common.Z);
  182. } else if (result[y][x] >= 204.0 && result[y][x] < 208.0) {
  183. stringBuffer.append(Common.Q);
  184. } else if (result[y][x] >= 208.0 && result[y][x] < 212.0) {
  185. stringBuffer.append(Common.T);
  186. }
  187. }
  188.  
  189. /**
  190. * Full white color
  191. * @param result
  192. * @param stringBuffer
  193. * @param y
  194. * @param x
  195. */
  196. private static void fullWhiteColor(double[][] result, StringBuffer stringBuffer, int y, int x) {
  197. if (result[y][x] >= 212.0 && result[y][x] < 216.0) {
  198. stringBuffer.append(Common.r);
  199. } else if (result[y][x] >= 216.0 && result[y][x] < 220.0) {
  200. stringBuffer.append(Common.s);
  201. } else if (result[y][x] >= 220.0 && result[y][x] < 224.0) {
  202. stringBuffer.append(Common.w);
  203. } else if (result[y][x] >= 224.0 && result[y][x] < 228.0) {
  204. stringBuffer.append(Common.u);
  205. } else if (result[y][x] >= 228.0 && result[y][x] < 232.0) {
  206. stringBuffer.append(Common.l);
  207. } else if (result[y][x] >= 232.0 && result[y][x] < 236.0) {
  208. stringBuffer.append(Common.i);
  209. } else if (result[y][x] >= 236.0 && result[y][x] < 240.0) {
  210. stringBuffer.append(Common.e);
  211. } else if (result[y][x] >= 240.0 && result[y][x] < 244.0) {
  212. stringBuffer.append(Common.COMMA);
  213. } else if (result[y][x] >= 244.0 && result[y][x] < 248.0) {
  214. stringBuffer.append(Common.m);
  215. } else if (result[y][x] >= 248.0 && result[y][x] < 252.0) {
  216. stringBuffer.append(Common.a);
  217. } else if (result[y][x] >= 252.0 && result[y][x] < 257.0) {
  218. stringBuffer.append(Common.BLANK);
  219. }
  220. }
  221. }

/imageHandler/src/com/b510/image/util/ScaledImageUtil.java

  1. /**
  2. *
  3. */
  4. package com.b510.image.util;
  5.  
  6. import java.awt.Graphics2D;
  7. import java.awt.Image;
  8. import java.awt.RenderingHints;
  9. import java.awt.image.BufferedImage;
  10. import java.io.File;
  11. import java.io.IOException;
  12.  
  13. import javax.imageio.ImageIO;
  14. import javax.swing.ImageIcon;
  15.  
  16. import com.b510.image.common.Common;
  17.  
  18. /**
  19. * @author Hongten
  20. * @created 2014-7-26
  21. */
  22. public class ScaledImageUtil {
  23.  
  24. public static int snapHeightMax = 196;
  25. public static int snapWidthMax = 200;
  26.  
  27. public static void scaledImage(String originalImagePath, int scaled, String scaledImagePath) {
  28. try {
  29. ImageIcon icon = getImage(ImageIO.read(new File(originalImagePath)), 5);
  30. BufferedImage savedImage = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_3BYTE_BGR);
  31. savedImage.createGraphics().drawImage(icon.getImage(), 0, 0, null);
  32. ImageIO.write(savedImage, getPostfix(originalImagePath), new File(scaledImagePath));
  33. System.out.println(Common.PROCESSED_SUCCESS);
  34. } catch (IOException e) {
  35. e.printStackTrace();
  36. }
  37. }
  38.  
  39. public static String getPostfix(String inputFilePath) {
  40. return inputFilePath.substring(inputFilePath.lastIndexOf(Common.FULL_STOP) + 1);
  41. }
  42.  
  43. public static ImageIcon getImage(Image img, int scaled) {
  44. ImageIcon icon = new ImageIcon(getImages(img, scaled));
  45. return icon;
  46. }
  47.  
  48. public static Image getImages(Image img, int scaled) {
  49. int heigth = 0;
  50. int width = 0;
  51.  
  52. if (scaled < 25) {
  53. scaled = 25;
  54. }
  55.  
  56. String sScaled = String.valueOf(Math.ceil((double) scaled / 25));
  57. int indexX = sScaled.indexOf(".");
  58. scaled = Integer.parseInt(sScaled.substring(0, indexX));
  59.  
  60. double scaleds = getScaling(img.getWidth(null), img.getHeight(null), scaled);
  61.  
  62. try {
  63. heigth = (int) (img.getHeight(null) * scaleds);
  64. width = (int) (img.getWidth(null) * scaleds);
  65. } catch (Exception e) {
  66. e.printStackTrace();
  67. }
  68.  
  69. return getScaledImage(img, width, heigth);
  70. }
  71.  
  72. public static Image getScaledImage(Image srcImg, int width, int heigth) {
  73. BufferedImage resizedImg = new BufferedImage(width, heigth, BufferedImage.TYPE_INT_RGB);
  74. Graphics2D g2 = resizedImg.createGraphics();
  75. g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
  76. g2.drawImage(srcImg, 0, 0, width, heigth, null);
  77. g2.dispose();
  78.  
  79. Image image = srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_DEFAULT);
  80.  
  81. return resizedImg;
  82. }
  83.  
  84. /**
  85. * Get the image zoom ratio
  86. * @param sourceWidth
  87. * @param sourceHeight
  88. * @return scaled
  89. */
  90. public static double getScaling(int sourceWidth, int sourceHeight, int scaled) {
  91. double widthScaling = ((double) snapWidthMax * (double) scaled) / (double) sourceWidth;
  92. double heightScaling = ((double) snapHeightMax * (double) scaled) / (double) sourceHeight;
  93.  
  94. double scaling = (widthScaling < heightScaling) ? widthScaling : heightScaling;
  95.  
  96. return scaling;
  97. }
  98. }

/imageHandler/src/com/b510/image/util/TextUtil.java

  1. /**
  2. *
  3. */
  4. package com.b510.image.util;
  5.  
  6. import java.io.BufferedWriter;
  7. import java.io.File;
  8. import java.io.FileWriter;
  9. import java.io.IOException;
  10.  
  11. import com.b510.image.common.Common;
  12.  
  13. /**
  14. * @author Hongten
  15. * @created Jul 23, 2014
  16. */
  17. /**
  18. * @author Hongten
  19. * @created 2014-7-26
  20. */
  21. public class TextUtil {
  22.  
  23. /**
  24. * Write the string to file.
  25. * @param stringBuffer
  26. */
  27. public static void write2File(StringBuffer stringBuffer) {
  28. File f = new File(Common.OUTPUT_TXT);
  29. BufferedWriter output = null;
  30. try {
  31. output = new BufferedWriter(new FileWriter(f));
  32. output.write(stringBuffer.toString());
  33. output.close();
  34. } catch (IOException e) {
  35. e.printStackTrace();
  36. }
  37. }
  38. }

源码下载:http://files.cnblogs.com/hongten/imageHandler_v1.2.rar

========================================================

More reading,and english is important.

I'm Hongten

  1. 大哥哥大姐姐,觉得有用打赏点哦!多多少少没关系,一分也是对我的支持和鼓励。谢谢。
    Hongten博客排名在100名以内。粉丝过千。
    Hongten出品,必是精品。

E | hongtenzone@foxmail.com  B | http://www.cnblogs.com/hongten

========================================================

java画图程序_图片用字母画出来_源码发布_版本二的更多相关文章

  1. java画图程序_图片用字母画出来_源码发布

    在之前写了一篇blog:java画图程序_图片用字母画出来 主要是把一些调试的截图发布出来,现在程序调试我认为可以了(当然,你如果还想调试的话,也可以下载源码自己调试). 就把源码发布出来. 项目结构 ...

  2. java画图程序_图片用字母画出来

    最近在研究怎样将图片用字母在文本编辑工具中“画”出来. 你看了这个可能还不知道我想说什么? 我想直接上图,大家一定就知道了 第一张:小猫 原图:http://www.cnblogs.com/hongt ...

  3. Android 图片加载框架Glide4.0源码完全解析(二)

    写在之前 上一篇博文写的是Android 图片加载框架Glide4.0源码完全解析(一),主要分析了Glide4.0源码中的with方法和load方法,原本打算是一起发布的,但是由于into方法复杂性 ...

  4. Java界面程序实现图片的放大缩小

    Java界面程序实现图片的放大缩小.这个程序简单地实现了图片的打开.保存.放大一倍.缩小一倍和固定缩放尺寸,但是并没有过多的涵盖对图片的细节处理,只是简单地实现了图片大小的放缩. 思维导图如下: 效果 ...

  5. Java学习-025-类名或方法名应用之一 -- 调试源码

    上文讲述了如何获取类名和方法名,敬请参阅: Java学习-024-获取当前类名或方法名二三文 . 通常在应用开发中,调试或查看是哪个文件中的方法调用了当前文件的此方法,因而在实际的应用中需要获取相应的 ...

  6. Java开源生鲜电商平台-商品表的设计(源码可下载)

    Java开源生鲜电商平台-商品表的设计(源码可下载) 任何一个电商,无论是B2C还是B2B的电商,商品表的设计关系到整个系统架构的核心. 1. 商品基本信息表:用单词:goods做为商品表 2. 商品 ...

  7. Java开源生鲜电商平台-订单表的设计(源码可下载)

    Java开源生鲜电商平台-订单表的设计(源码可下载) 场景分析说明: 买家(餐馆)用户,通过APP进行选菜,放入购物车,然后下单,最终支付的流程,我们称为下单过程. 买家可以在张三家买茄子,李四家买萝 ...

  8. 『TensorFlow』SSD源码学习_其一:论文及开源项目文档介绍

    一.论文介绍 读论文系列:Object Detection ECCV2016 SSD 一句话概括:SSD就是关于类别的多尺度RPN网络 基本思路: 基础网络后接多层feature map 多层feat ...

  9. Java开源生鲜电商平台-盈利模式详解(源码可下载)

    Java开源生鲜电商平台-盈利模式详解(源码可下载) 该平台提供一个联合买家与卖家的一个平台.(类似淘宝购物,这里指的是食材的购买.) 平台有以下的盈利模式:(类似的平台有美菜网,食材网等) 1. 订 ...

随机推荐

  1. 【翻译十九】-java之执行器

    Executors In all of the previous examples, there's a close connection between the task being done by ...

  2. POJ3685 Matrix(嵌套二分)

    同行元素递减,同列元素递增,采用嵌套二分的方法 #include<cstdio> #include<iostream> #include<cstdlib> #inc ...

  3. 数据结构之图 Part2 - 1

    邻接矩阵 网上很少有C# 写图的数据结构的例子,实际的项目中也从来没用过Array 这坨东西,随手写个,勿喷. namespace LH.GraphConsole { public struct Gr ...

  4. gdb optimized out错误解决

    转自:http://blog.csdn.net/cws1214/article/details/12023093 when linux gdb debug, print a variable, suc ...

  5. Serializable序列化对象

    Serializable序列化对象发送: Intent intent = new Intent(); intent.setClass(mContext, HomeDetailReportActivit ...

  6. excel、csv、txt文件数据读取

    /// <summary> /// 读取Excel表每一行第一列的字符串集合 /// </summary> /// <param name="filePath& ...

  7. FZU Problem 2082 过路费 树链剖分

    Problem 2082 过路费    Problem Description 有n座城市,由n-1条路相连通,使得任意两座城市之间可达.每条路有过路费,要交过路费才能通过.每条路的过路费经常会更新, ...

  8. Java 之 多线程编程

    1.线程: a.由来:单任务OS -- 多任务OS b.进程:每一个进程对应一个应用程序,分配独立内存空间 c.线程:线程是进程内部的一个独立的执行分支 d.特点:共享内容地址空间,切换成本更低 2. ...

  9. JSHint配置详解

    Also available on Github JSHint配置详解 增强参数(Enforcing Options) 本类参数设为true,JSHint会产生更多告警. bitwise 禁用位运算符 ...

  10. 在CentOS中快速安装PHP,MySQL,Nginx和phpMyAdmin

    安装环境 yum install -y autoconf automake gcc gcc-c++ git libtool make nasm pkgconfig zlib-devel vim 安装p ...