当前位置:   article > 正文

java 图片操作技术之RGB的获取_java8 bufferedimage 的rgb能否存储超过256的值并读取出来

java8 bufferedimage 的rgb能否存储超过256的值并读取出来
  1. /**
  2. * 名词解释:
  3. * 饱和度是指色彩的鲜艳程度,也称色彩的纯度。
  4. * 灰度:使用黑色调表示物体,即用黑色为基准色,不同的饱和度的黑色来显示图像。
  5. * 像素:如同摄影的相片一样,数码影像也具有连续性的浓淡阶调,我们若把影像放大数倍,会发现这些连续色调其实是由许多色彩相近的小方点所组成,
  6. * 这些小方点就是构成影像的最小单元——像素。是分辨率的尺寸单位。
  7. * 像素是基本原色素及其灰度的基本编码。我们看到的数字图片是有一个二维的像素矩阵组成。
  8. * 像素在计算机中通常用3个字节24位保存,如16-23 位表示红色(R)分量,8-15 位表示绿色(G)分量,0-7 位表示蓝色(B)分量;
  9. * 当图片尺寸以像素为单位时,每一厘米等于28像素,比如15*15厘米长度的图片,等于420*420像素的长度。
  10. * 一个像素所能表达的不同颜色数取决于比特每像素(BPP)。如8bpp[2^8=256色, 灰度图像]、16bpp[2^16=65536色,称为高彩色]、24bpps[2^24=16777216色,称为真彩色]。
  11. * 分辨率:图像总像素的多少,称为图像分辨率。
  12. * RGB: 颜色模型,是将颜色表示成数字形式的模型,或者说是一种记录图像颜色的方式。详情百度
  13. *
  14. * 下列代码是将一个图片分解成R,G,B三种色彩灰度图片的算法
  15. * 也可参考原著为:http://blog.csdn.net/luoweifu/article/details/8042494
  16. *
  17. */
  18. package test;
  19. import java.awt.Color;
  20. import java.awt.image.BufferedImage;
  21. import java.io.File;
  22. import java.io.FileOutputStream;
  23. import java.io.IOException;
  24. import java.io.OutputStream;
  25. import javax.imageio.ImageIO;
  26. public class MyImage {
  27. // 将图片分解为R,G,B三种灰度图片
  28. /**
  29. *
  30. * @param filePath 原图片路径
  31. * @param newFilePath 您想要生成的图片路径
  32. * @param type 选择生成类型1为R,2G,3为B
  33. */
  34. public static void analyseRGB(String filePath, String newFilePath, int type) {
  35. OutputStream output = null;
  36. try {
  37. BufferedImage img = ImageIO.read(new File(filePath));
  38. int imageType = img.getType();// 获取图片类型
  39. int width = img.getWidth();// 获取图片宽度
  40. int height = img.getHeight();// 获取图片高度
  41. int startX = 0;// 开始的横坐标
  42. int startY = 0;// 开始的纵坐标
  43. int offset = 0;// 偏移量
  44. int scansize = width;// 扫描间距
  45. int dd = width - startX;// 被遍历的宽度间距
  46. int hh = height - startY;// 被遍历的高度间距
  47. int x0 = width / 2;// 横向中间点
  48. int y0 = height / 2;// 纵向中间点
  49. System.out.println("dd:" + dd + " hh:" + hh);
  50. System.out.println("width:" + width + " height:" + height);
  51. System.out.println("imageType:" + imageType);
  52. System.out.println("size:"+(offset + hh * scansize + dd));
  53. // rgb的数组,保存像素,用一维数组表示二位图像像素数组
  54. int[] rgbArray = new int[offset + hh * scansize + dd];// 偏移量+纵向开始坐标*扫描间距+横向开始坐标
  55. //这里大家都感觉很奇怪为什么会是这样一个算法呢?为什么不知道用width*height就够用了,这里作者也搞不懂,你只要默认记住了这个规则,
  56. //然后取点的时候按这个规则去取就可以了
  57. // newArray 保存处理后的像素
  58. int[] newArray = new int[offset + hh * scansize + dd];// 偏移量+纵向开始坐标*扫描间距+横向开始坐标
  59. /**
  60. * getRGB public int[] getRGB(int startX, int startY, int w, int h,
  61. * int[] rgbArray, int offset, int scansize)从图像数据的某一部分返回默认 RGB 颜色模型
  62. * (TYPE_INT_ARGB) 和默认 sRGB 颜色空间中整数像素数组。如果该默认模型与该图像的 ColorModel
  63. * 不匹配,则发生颜色转换。在使用此方法所返回的数据中,每个颜色分量只有 8 位精度。通过图像中指定的坐标 (x, y),ARGB
  64. * 像素可以按如下方式访问:
  65. *
  66. * pixel = rgbArray[offset + (y-startY)*scansize + (x-startX)];
  67. * 如果该区域不在边界内部,则抛出 ArrayOutOfBoundsException。但是,不保证进行显式的边界检查。
  68. *
  69. *
  70. * 参数:
  71. * startX - 起始 X 坐标
  72. * startY - 起始 Y 坐标
  73. * w - 区域的宽度
  74. * h - 区域的高度
  75. * rgbArray - 如果不为 null,则在此写入 rgb 像素
  76. * offset - rgbArray 中的偏移量
  77. * scansize - rgbArray 的扫描行间距
  78. * 返回: RGB 像素数组。
  79. */
  80. img.getRGB(startX, startY, width, height, rgbArray, offset,
  81. scansize); // 把像素存到固定的数组里面去
  82. int count=0;
  83. for(int i : rgbArray){
  84. System.out.println(i);
  85. if(i!=0){
  86. count=count+1;
  87. }
  88. }
  89. System.out.println(count);
  90. int rgb = rgbArray[offset + (y0 - startY) * scansize
  91. + (x0 - startX)]; // 位于图片正中央的rgb像素点
  92. Color c = new Color(rgb);
  93. System.out.println("中间像素点的rgb:"+c);
  94. for (int i = 0; i < height - startY; i++) {//遍历每一行
  95. for (int j = 0; j < width - startX; j++) {//遍历每一列
  96. c = new Color(rgbArray[offset+i * scansize + j]);
  97. switch (type) {
  98. case 1://红色灰度图片
  99. newArray[i*dd + j] = new Color(c.getRed(), 0, 0).getRGB();
  100. break;
  101. case 2://绿色灰度图片
  102. newArray[i*dd + j] = new Color(0, c.getGreen(), 0).getRGB();
  103. break;
  104. case 3://蓝色灰度图片
  105. newArray[i * dd + j] = new Color(0, 0, c.getBlue()).getRGB();
  106. break;
  107. default:
  108. break;
  109. }
  110. }
  111. }
  112. // 新建一个图像
  113. File out = new File(newFilePath);
  114. if (!out.exists())
  115. out.createNewFile();
  116. output = new FileOutputStream(out);
  117. BufferedImage imgOut = new BufferedImage(width, height,
  118. BufferedImage.TYPE_3BYTE_BGR);
  119. imgOut.setRGB(startX, startY, width, height, newArray, offset,
  120. scansize);
  121. ImageIO.write(imgOut, "jpg", output);
  122. } catch (IOException e) {
  123. // TODO 自动生成的 catch 块
  124. e.printStackTrace();
  125. }
  126. }
  127. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/67497
推荐阅读
相关标签
  

闽ICP备14008679号