/*** 名词解释:* 饱和度是指色彩的鲜艳程度,也称色彩的纯度。* 灰度:使用黑色调表示物体,即用黑色为基准色,不同的饱和度的黑色来显示图像。* 像素:如同摄影的相片一样,数码影像也具有连续性的浓淡阶调,我们若把影像放大数倍,会发现这些连续色调其实是由许多色彩相近的小方点所组成,* 这些小方点就是构成影像的最小单元——像素。是分辨率的尺寸单位。* 像素是基本原色素及其灰度的基本编码。我们看到的数字图片是有一个二维的像素矩阵组成。* 像素在计算机中通常用3个字节24位保存,如16-23 位表示红色(R)分量,8-15 位表示绿色(G)分量,0-7 位表示蓝色(B)分量;* 当图片尺寸以像素为单位时,每一厘米等于28像素,比如15*15厘米长度的图片,等于420*420像素的长度。 * 一个像素所能表达的不同颜色数取决于比特每像素(BPP)。如8bpp[2^8=256色, 灰度图像]、16bpp[2^16=65536色,称为高彩色]、24bpps[2^24=16777216色,称为真彩色]。*  分辨率:图像总像素的多少,称为图像分辨率。*  RGB: 颜色模型,是将颜色表示成数字形式的模型,或者说是一种记录图像颜色的方式。详情百度*  *  下列代码是将一个图片分解成R,G,B三种色彩灰度图片的算法* 也可参考原著为:http://blog.csdn.net/luoweifu/article/details/8042494* */
package test;import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;import javax.imageio.ImageIO;public class MyImage {// 将图片分解为R,G,B三种灰度图片/*** * @param filePath 原图片路径* @param newFilePath 您想要生成的图片路径* @param type 选择生成类型1为R,2G,3为B*/public static void analyseRGB(String filePath, String newFilePath, int type) {OutputStream output = null;try {BufferedImage img = ImageIO.read(new File(filePath));int imageType = img.getType();// 获取图片类型int width = img.getWidth();// 获取图片宽度int height = img.getHeight();// 获取图片高度int startX = 0;// 开始的横坐标int startY = 0;// 开始的纵坐标int offset = 0;// 偏移量int scansize = width;// 扫描间距int dd = width - startX;// 被遍历的宽度间距int hh = height - startY;// 被遍历的高度间距int x0 = width / 2;// 横向中间点int y0 = height / 2;// 纵向中间点System.out.println("dd:" + dd + " hh:" + hh);System.out.println("width:" + width + " height:" + height);System.out.println("imageType:" + imageType);System.out.println("size:"+(offset + hh * scansize + dd));// rgb的数组,保存像素,用一维数组表示二位图像像素数组int[] rgbArray = new int[offset + hh * scansize + dd];// 偏移量+纵向开始坐标*扫描间距+横向开始坐标//这里大家都感觉很奇怪为什么会是这样一个算法呢?为什么不知道用width*height就够用了,这里作者也搞不懂,你只要默认记住了这个规则,//然后取点的时候按这个规则去取就可以了// newArray 保存处理后的像素int[] newArray = new int[offset + hh * scansize + dd];// 偏移量+纵向开始坐标*扫描间距+横向开始坐标/*** getRGB public int[] getRGB(int startX, int startY, int w, int h,* int[] rgbArray, int offset, int scansize)从图像数据的某一部分返回默认 RGB 颜色模型* (TYPE_INT_ARGB) 和默认 sRGB 颜色空间中整数像素数组。如果该默认模型与该图像的 ColorModel* 不匹配,则发生颜色转换。在使用此方法所返回的数据中,每个颜色分量只有 8 位精度。通过图像中指定的坐标 (x, y),ARGB* 像素可以按如下方式访问:* * pixel = rgbArray[offset + (y-startY)*scansize + (x-startX)];* 如果该区域不在边界内部,则抛出 ArrayOutOfBoundsException。但是,不保证进行显式的边界检查。* * * 参数:*  startX - 起始 X 坐标 *  startY - 起始 Y 坐标 *  w - 区域的宽度 *  h - 区域的高度* rgbArray - 如果不为 null,则在此写入 rgb 像素 * offset - rgbArray 中的偏移量* scansize - rgbArray 的扫描行间距 * 返回: RGB 像素数组。*/img.getRGB(startX, startY, width, height, rgbArray, offset,scansize); // 把像素存到固定的数组里面去int count=0;for(int i : rgbArray){System.out.println(i);if(i!=0){count=count+1;}}System.out.println(count);int rgb = rgbArray[offset + (y0 - startY) * scansize+ (x0 - startX)]; // 位于图片正中央的rgb像素点Color c = new Color(rgb);System.out.println("中间像素点的rgb:"+c);for (int i = 0; i < height - startY; i++) {//遍历每一行for (int j = 0; j < width - startX; j++) {//遍历每一列c = new Color(rgbArray[offset+i * scansize + j]);switch (type) {case 1://红色灰度图片newArray[i*dd + j] = new Color(c.getRed(), 0, 0).getRGB();break;case 2://绿色灰度图片newArray[i*dd + j] = new Color(0, c.getGreen(), 0).getRGB(); break;case 3://蓝色灰度图片newArray[i * dd + j] = new Color(0, 0, c.getBlue()).getRGB();break;default:break;}}}// 新建一个图像File out = new File(newFilePath);if (!out.exists())out.createNewFile();output = new FileOutputStream(out);BufferedImage imgOut = new BufferedImage(width, height,BufferedImage.TYPE_3BYTE_BGR);imgOut.setRGB(startX, startY, width, height, newArray, offset,scansize);ImageIO.write(imgOut, "jpg", output);} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}}
}

java 图片操作技术之RGB的获取相关推荐

  1. 实现图片中文的识别和获取图片上文字的坐标(java实现)

    实现图片中文的识别和获取图片上文字的坐标(java实现)            现在利用python来进行图片的文字识别较为普遍,但是如果我们利用常用的家庭电脑来识别,需要的时间比较长,达到20~30 ...

  2. Java图片相似度,图像识别

    Java图片相似对比实例 package com.icss.main; import java.awt.AWTException; import java.awt.Dimension; import ...

  3. java图片处理以及pdf转图片

    java图片处理以及pdf转图片 1.需求 之前项目里面有用到显示pdf的模块,需要将pdf显示处理,也结合了一些插件,pdf.js是firefox浏览器推出的一套h5渲染pdf的前端插件,支持移动端 ...

  4. java 图片 缩略图_java 图片缩略图的两种方法

    最近网上看到两种不同的java图片缩略图的绘制方案 第一种,使用Graphics().drawImage按照一定的比例重新绘制图像. package com.image.suoluetu; impor ...

  5. java图片增加马赛克

    java图片增加马赛克 粘贴即用 具体需要根据项目情况进行调整 粘贴即用 具体需要根据项目情况进行调整 借鉴了许多代码粘贴的 不是原创 只是代码的拼凑师 package com.ruoyi.hfive ...

  6. Java 图片转换为字符图 CharMaps (整理)

    /** Java 图片转换成字符图 CharMaps (整理) * * 2016-1-2 深圳 南山平山村 曾剑锋 ** @(#)CharMaps.java 2014/1/16 * 1.这个一个Jav ...

  7. 图片比对java,Java图片比对

    在自动化测试中,除了普通的值验证,经常还有一些图片验证,比如图片的匹配率,输出图片的差异图片等.本文主要用到了BufferedImage类来操作图片比对和输出差异图片,大体的思路如下: 1. 通过Im ...

  8. java 图片合并成pdf_Java中PDF的转换(图片)与展示

    解决的问题 有些时候我们需要在项目中展示PDF,但是直接在浏览器中加入PDF展示的插件,存在兼容性问题,某些浏览器显示效果不理想,所以我们可以将PDF转为图片,然后已图片的方式展示,效果很好. 那么怎 ...

  9. Java图片操作 --- 图片的读取、绘制、缩放、裁剪、保存

    本文链接: http://blog.csdn.net/xietansheng/article/details/78453570 Java Swing 图形界面开发(目录) 1. 读取图片 方法一: 通 ...

最新文章

  1. 东北大学计算机分数线2017,东北大学2017年本科一批录取分数线(全国)
  2. 4.3.6 无分类编址CIDR
  3. Eclipse工程标准目录层次结构
  4. 金三银四面试季来临,最新BAT面试资料分享给大家
  5. 洞悉物联网发展1000问之从精益管理到互联工业带来的启示是什么?
  6. linux下面拷贝pdf却没法在windows下面打开
  7. 【Python】Matplotlib绘制机器学习中的判别分析示意图
  8. 华为开源构建工具_5个开源工具可快速构建地图应用
  9. UVA10427 Naughty Sleepy Boys【数学】
  10. 强化学习中价值迭代和策略迭代各有什么优缺点?
  11. 【从C到C++学习笔记】类声明/公有私有保护成员/数据抽象和封装
  12. mysql replication(主从复制)(二)MSS模式
  13. 802.11电源管理模式
  14. 计算机二级题库删去哪套,Word标题前出现黑块究竟要怎么删除
  15. 离线安装tensorboardx_pytorch安装
  16. mysql数据库中学分的简写_一些数据库相关词汇缩写
  17. 2014年双11淘宝靠谱外贸原单店铺和天猫店铺推荐
  18. firefox 显示网页加载时间的插件
  19. 梅卡尔大学-IOT-前端笔记
  20. LINUX留后门--教程(七)—— alias 后门

热门文章

  1. 南柯服务器压力,从纳兰性德《木兰花》中看网络暴力和舆论压力带来的抑郁现象...
  2. 【AirPlay2开发】协议整合
  3. rfc 5766 TURN 中文
  4. 1024程序员节打卡
  5. matlab中的箭头符号怎么打开,MATLAB中上下标、斜体、箭头等符号的使用方法
  6. 网页电话/手机号码识别
  7. [PTA]实验5-3 使用函数求奇数和
  8. Apple pay 苹果支付
  9. Docker学习总结(46)——生产环境中遇到的Docker常见异常错误总结
  10. 如何在没有密码的情况下解锁 iPhone