java 读取图片色深

摘要:
我想用C语言写,但很麻烦。最后,我选择了比许多其他方法更快的Java。最后,它被打包成一个jar包,只要安装了jdk,就可以在控制台上运行。我使用MYECLIPSE。步骤如下:1.创建项目;2.创建一个java类;3.程序包含两个类getinfo。java和methodclass。Java语言获取信息。java包含main()方法。代码如下:importjava。io。文件Publicclassgetinfo{publicstaticvoidmain{//TODOAutogeneratedmethodstubStringurl;if(args.length!其中getImageInfo.jar是最终生成的jar包,参数1、参数2、参数3…methodclass.java类主要完成读取图像信息的特定方法,并支持png、jpeg、gif和bmp格式。

问题:

想写一个小程序可读取图片的色深(bit-depth)。网上有一些软件可完成这个功能,但是我想把程序做成一个可移植的插件。

本想用c写的,但实在麻烦,最后选择java,与很多方法不用自己写,速度快。

最后打包成一个jar包,只要装了jdk就可以在控制台运行。

java 读取图片色深第1张

我用的是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包,命令如下图:

java 读取图片色深第2张

注意:

1.路径f:\tmpxu\222.jpg 必须两个“”。

2.window里切换路径和linux不同,不能直接用cd,先切换到f盘,直接输入“f:”命令,回车;

   然后cd 到目标目录即可。

3.执行jar包用java -jar file.jar 命令;

最后得到色深为8;

java 读取图片色深第3张

免责声明:文章转载自《java 读取图片色深》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇共享文件夹切换用户、局域网共享切换用户的方法老李分享:Android -自动化埋点 3下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

iOS ASA 的归因技术支持_Swift

ASA简介苹果ASA搜索广告服务已全面上线,在App Store中搜索关键词,搜索结果的顶部会出现带有“广告”标识的App展示。 ASA拥有高转化率、低成本、用户精准、流量安全等优势,是一个相当重要的获量渠道。ASA不知道是什么请看这里 https://ads.apple.com/cn/?cid=BD-BZ-Desktop-SC-CN-001 ASA投放...

php图片压缩

php图片压缩 能对图片的大小、质量进行压缩。 <?php class ThumbHandler {     var $dst_img;// 目标文件     var $h_src; // 图片资源句柄     var $h_dst;// 新图句柄     var $h_mask;// 水印句柄     var $img_create_quality...

Java消息系统简单设计与实现

前言:由于导师在我的毕设项目里加了消息系统(本来想水水就过的..),没办法...来稍微研究研究吧..简单简单... 需求分析 我的毕设是一个博客系统,类似于简书这样的,所以消息系统也类似,在用户的消息里包含了有:喜欢和赞、评论、关注、私信这样的一类东西,这样的一个系统应该包含以下的功能: 当用户评论/关注/点赞时能够通知到被评论/关注/点赞的用户,并...

ajax实现文件上传,多文件上传,追加参数

1.html部分实现代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>文件上传</title> </head> <body> <form id= "uploadForm">...

springsession生成sessionid不一致问题解决

不废话,本人遇到的问题主要是两个不同的springboot版本,需要共享sessionid。 1.配置application #cookie作用域server.servlet.session.cookie.path=/server.servlet.session.cookie.max-age=-1server.servlet.session.cookie....

EF core的原生SQL查询以及用EF core进行分页查询遇到的问题

在用.net core进行数据库访问,需要处理一些比较复杂的查询,就不得不用原生的SQL查询了,然而EF Core 和EF6 的原生sql查询存在很大的差异。 在EF6中我们用SqlQuery和ExecuteSqlCommand进行sql语句的执行,而在EF Core中我们则使用FromSql和ExecuteSqlCommand 一.ExecuteSqlC...