java 读取图片色深
问题:
想写一个小程序可读取图片的色深(bit-depth)。网上有一些软件可完成这个功能,但是我想把程序做成一个可移植的插件。
本想用c写的,但实在麻烦,最后选择java,与很多方法不用自己写,速度快。
最后打包成一个jar包,只要装了jdk就可以在控制台运行。
我用的是MYECLIPSE,步骤如下:
1.创建一个工程;
2.创建一个java class;
3.程序包含两个类getinfo.java 和 methodclass.java;
getinfo.java包含main()方法,代码如下:
import java.io.File; public class getinfo {
public static void main(String[] args) {
// TODO Auto-generated method stub
String url;
if (args.length != 0) {
url = args[0];
} else
url = "F:\\tmpxu\\333.png";
File f1 = new File(url);// "F:\\tmpxu\\333.png"
methodclass my = new methodclass();
my.ImageInfo(f1);
System.out.println("getName====" + my.getName());
System.out.println("getPath====" + my.getPath());
System.out.println("getDate_created====" + my.getDate_created());
System.out.println("getDate_modified====" + my.getDate_modified());
System.out.println("getType====" + my.getType());
System.out.println("getSize====" + my.getSize());
System.out.println("getWidth====" + my.getWidth());
System.out.println("getHeight====" + my.getHeight());
System.out.println("getBit_depth====" + my.getBit_depth());
}
}
这里注意:
控制台命令: java -jar getImageInfo.jar 参数1 参数2 参数3……
其中getImageInfo.jar为最终生成的jar包,参数1 参数2 参数3……可作为main(String args[])的参数,从String args[]中得到。
methodclass.java类主要完成具体的读取图片信息的方法,支持png 、jpeg 、gif 、bmp格式。
代码大多来自这个链接:http://yuncode.net/code/c_53881eaa2532066,整理后的代码如下:
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.StringTokenizer;
import javax.imageio.ImageIO; public class methodclass {
private String name = "";
private String path = "";
private String date_created = "";
private String date_modified = "";
private String bytes = "";
private String type = "";
private String size = "";
private String width = "";
private String height = "";
private String bit_depth = ""; public void ImageInfo(File file) {
name = file.getName();
path = file.getParent();
date_created = getDate_created(file);
date_modified = new SimpleDateFormat("yyyy/MM/dd HH:mm")
.format(new Date(file.lastModified()));
bytes = getBytes(file);
getImageData(file);
getImageFileData(file);
} // 判读图片类型
private void getImageFileData(File file) {
try {
FileInputStream input = new FileInputStream(file);
/*
* he java.io.FileInputStream.available() method returns number of
* remaining bytes that can be read from this input stream without
* blocking by the next method call for this input stream. The next
* method call can also be the another thread.
* 通过available方法取得流的最大字符数
*/
byte[] b = new byte[input.available()];
if (b.length == 0) {
System.out.print("the file is empty!!!");
return;
}
input.read(b);
input.close();
int b1 = b[0] & 0xff;
int b2 = b[1] & 0xff;
if (b1 == 0x42 && b2 == 0x4d) {
checkBmp(b);
} else if (b1 == 0x47 && b2 == 0x49) {
checkGif(b);
} else if (b1 == 0x89 && b2 == 0x50) {
checkPng(b);
} else if (b1 == 0xff && b2 == 0xd8) {
checkJpeg(b, file);
}
} catch (IOException e) {
e.printStackTrace();
}
} // 获得图片宽高
private void getImageData(File file) {
try {
BufferedImage img = ImageIO.read(file);
size = img.getWidth() + " x " + img.getHeight();
width = img.getWidth() + " 像素";
height = img.getHeight() + " 像素";
} catch (IOException e) {
e.printStackTrace();
}
} public void checkBmp(byte[] b) {
type = "BMP 文件";
int bitsPerPixel = (b[28] & 0xff) | (b[29] & 0xff) << 8;
if (bitsPerPixel == 1 || bitsPerPixel == 4 || bitsPerPixel == 8
|| bitsPerPixel == 16 || bitsPerPixel == 24
|| bitsPerPixel == 32) {
bit_depth = bitsPerPixel + "";
}
} public void checkGif(byte[] b) {
type = "GIF 文件";
bit_depth = (b[10] & 0x07) + 1 + "";
} public void checkPng(byte[] b) {
type = "PNG 图像";
int bitsPerPixel = b[24] & 0xff;
if ((b[25] & 0xff) == 2) {
bitsPerPixel *= 3;
} else if ((b[25] & 0xff) == 6) {
bitsPerPixel *= 4;
}
bit_depth = bitsPerPixel + "";
} /*
* (b[i] & 0xff):byte转换int时的运算 其原因在于:1.byte的大小为8bits而int的大小为32bits;
* 2.java的二进制采用的是补码形式;
* 如果不进行&0xff,那么当一个byte会转换成int时,由于int是32位,而byte只有8位这时会进行补位,
* 例如补码11111111的十进制数为-1转换为int时变为32个1!和0xff相与后,高24比特就会被清0了,结果就对了。 bit_depth:
* a 1 bit image, can only show two colors, black and white. That is because
* the 1 bit can only store one of two values, 0 (white) and 1 (black). An 8
* bit image can store 256 possible colors, while a 24 bit image can display
* about 16 million colors.
*/
public void checkJpeg(byte[] b, File file) {
type = "JPEG 图像";
int i = 2;
while (true) {
int marker = (b[i] & 0xff) << 8 | (b[i + 1] & 0xff);
int size = (b[i + 2] & 0xff) << 8 | (b[i + 3] & 0xff);
if (marker >= 0xffc0 && marker <= 0xffcf && marker != 0xffc4
&& marker != 0xffc8) {
bit_depth = (b[i + 4] & 0xff) * (b[i + 9] & 0xff) + "";
break;
} else {
i += size + 2;
}
}
} // 文件创建日期
private String getDate_created(File file) {
try {
Process ls_proc = Runtime.getRuntime().exec(
"cmd.exe /c dir \"" + file.getAbsolutePath() + "\" /tc");
BufferedReader reader = new BufferedReader(new InputStreamReader(
ls_proc.getInputStream()));
for (int i = 0; i < 5; i++) {
reader.readLine();
}
StringTokenizer st = new StringTokenizer(reader.readLine());
String date = st.nextToken();
String time = st.nextToken();
reader.close();
return date + " " + time;
} catch (IOException e) {
e.printStackTrace();
}
return "";
} // 读取文件大小
private String getBytes(File file) {
DecimalFormat df = new DecimalFormat();
float length = (float) file.length();
int p = 0;
while (length > 1023) {
length /= 1024;
p++;
}
if (length > 99) {
df.setMaximumFractionDigits(0);
} else if (length > 9) {
df.setMaximumFractionDigits(1);
} else {
df.setMaximumFractionDigits(2);
}
if (p == 0) {
return (int) length + " 字节";
} else if (p == 1) {
return df.format(length) + " KB";
} else if (p == 2) {
return df.format(length) + " MB";
} else if (p == 3) {
return df.format(length) + " GB";
} else {
return df.format(length) + " TB";
}
} public String getName() {
return name;
} public String getPath() {
return path;
} public String getDate_created() {
return date_created;
} public String getDate_modified() {
return date_modified;
} public String getBytes() {
return bytes;
} public String getType() {
return type;
} public String getSize() {
return size;
} public String getWidth() {
return width;
} public String getHeight() {
return height;
} public String getBit_depth() {
return bit_depth;
}
}
1.生成jar包:生成jar包时,程序不能有错误、不能有警告,编译通过后可export,我这里jar包命名为getImageInfo.jar;
2.控制台运行jar包,命令如下图:
注意:
1.路径f:\\tmpxu\\222.jpg 必须两个“\”。
2.window里切换路径和linux不同,不能直接用cd,先切换到f盘,直接输入“f:”命令,回车;
然后cd 到目标目录即可。
3.执行jar包用java -jar file.jar 命令;
最后得到色深为8;
java 读取图片色深的更多相关文章
- Java读取图片exif信息实现图片方向自动纠正
起因 一个对试卷进行OCR识别需求,需要实现一个功能,一个章节下的题目图片需要上下拼接合成一张大图,起初写了一个工具实现图片的合并,程序一直很稳定的运行着,有一反馈合成的图片方向不对,起初怀疑是本身图 ...
- java 读取图片并转化为二进制字符串
本例子的目的在于测试往oracle数据库中插入blob字段 //以下代码源于:https://www.cnblogs.com/ywlx/p/4544179.html public static Str ...
- java读取图片的(尺寸、拍摄日期、标记)等EXIF信息
1.metadata-extractor是 处理图片EXIF信息的开源项目,最新代码及下载地址:https://github.com/drewnoakes/metadata-extractor 2.本 ...
- JAVA 读取图片储存至本地
需求:serlvet经过处理通过报表工具返回一张报表图(柱状图 折线图). 现在需要把这个图存储到本地 以便随时查看 // 构造URL URL url = new URL(endStr); // 打开 ...
- Java读取图片并修改像素,创建图片
public void replaceImageColor(String file, Color srcColor, Color targetColor) throws IOException{ UR ...
- java读取远程url图片,得到宽高
链接地址:http://blog.sina.com.cn/s/blog_407a68fc0100nrb6.html import java.io.IOException;import java.awt ...
- java读取网页图片路径并下载到本地
java读取网页图片路径并下载到本地 最近公司需要爬取一些网页上的数据,自己就简单的写了一个demo,其中有一些数据是图片,需要下载下来到本地并且 将图片的路径保存到数据库,示例代码如下: packa ...
- JAVA实现读取图片
话不读说 直接上代码 package cn.kgc.ssm.common; import java.io.*; /** * @author * @create 2019-08-15 9:36 **/ ...
- java IO流读取图片供前台显示
最近项目中需要用到IO流来读取图片以提供前台页面展示,由于以前一直是用url路径的方式进行图片展示,一听说要项目要用IO流读取图片感觉好复杂一样,但任务下达下来了,做为程序员只有选择去执行喽,于是找了 ...
随机推荐
- ASP.NET MVC学习之控制器篇扩展性
原文:ASP.NET MVC学习之控制器篇扩展性 一.前言 在之前的一篇随笔中已经讲述过控制器,而今天的随笔是作为之前的扩展. 二.正文 1.自定义动作方法 相信大家在开发过程一定会遇到动作方法的重名 ...
- Java设计模式偷跑系列(十二)组合模式建模和实现
转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39828653 组合模式(Composite):组合模式有时又叫部分-总体模式.将对象组合成 ...
- Java 测试并行编程(三)
有很多其他的交替运行 因为在并行代码中的错误一般是低概率事件.因此,试运行并发差错时需要反复多次,但是,有很多方法可以提高发现这些错误的概率 ,在前面提到的,在多处理器系统.假设 线程的数量,那么 与 ...
- C# Email邮件发送,功能是密码找回或者重置功能。
原文:C# Email邮件发送,功能是密码找回或者重置功能. 最近根据公司需求,写个邮件发送. 这里面的传入的地址信息的参数都是经过加密的. 主要是保证用户信息的安全. 帮助类 using ...
- 基于ip san的iscsi操作执行过程
SAN它是storage area network(存储区域网络)速记,早期san光纤通道技术被用于.当迟到iscsi协议后出现,为了在这两者之间区分.它分IP SAN和FC SAN.FC SAN由于 ...
- 教你一步一步部署.net免费空间OpenShift系列之三------上传ASP.net程序
接上回书,创建应用后,我们如何将自己的ASP.Net部署到应用空间呢,这里用WinSCP的SFTP协议进行上传和下载 上传ASP.net程序 下载WinSCP,并打开PuTTYGen 点击Genera ...
- POJ1320 Street Numbers【佩尔方程】
主题链接: http://poj.org/problem?id=1320 题目大意: 求解两个不相等的正整数N.M(N<M),使得 1 + 2 + - + N = (N+1) + - + M.输 ...
- Phpstorm配置phpunit对php进行单元测试
在 phpstorm 中配置 php 项目的单元测试,项目使用 Composer 进行管理,为了避免在项目中直接引入 phpunit 相关代码包,使项目的 vendor 目录变得臃肿,这里采用全局安装 ...
- PhotoShop CC安装抠图插件KnockOut 2
1.KnockOut 2只有32位版本,因此需要给32位的PhotoShop CC安装. 2.下载地址:http://www.cr173.com/soft/28207.html 3.安装KnockOu ...
- ASP.Net使用母版页窗
背景:每一个网页的基本框架结构类似: 浏览站点的时候会发现,好多站点中.每一个网页的基本框架都是一样的,比方,最上面都是站点的标题,中间是内容.最以下是站点的版权.开发提供商等信息: watermar ...