在做人脸识别项目中,首先需要注册人脸,目前程序要求在指定的文件夹存入文件格式为JPG的图片即完成人脸注册。使用中,部分用户对JPG格式理解不深,误以为只要以“.JPEG”或者“.jpg”结尾的图片就是JPG格式,甚至有用户还特意把“张三 .png”改成“张三.jpg”伪装成JPG格式来满足要求。
其实文件扩展名(.jpg)与文件格式无关,是人们为了便于区分,强加的扩展名。就像linux系统里文件根本就没有扩展名的。那么如何通过代码判断该图片文件是否是JPG呢?我们需要了解图片文件的存储,bmp,jpg,png图片存储差异很大,但是归结起来主要分为三部分:文件头,调色板,数据区;我们可以通过读取文件头来判断该文件的格式,最后会按照这种思路封装的一个工具类,主要用于bmp,png转换成JPG。
如何快速确认一张图片的文件格式呢?其实任意一款文本编辑器都可以读取文件头,下面以EditPlus为例;选中图片右键用EditPlus打开(d框,选择“否”),然后一堆乱码出来了,然后从乱码里寻找下文件头即可。下面三张扩展名均为JPG的图片中只有一张文件格式为JPG的。
揪出两张伪JPG图片文件,如何快速修改文件格式呢?常规做法就是用PS(或画图板)打开图片然后另存为JPG格式。好吧,说好的快速呢,PS也叫快啊?!其实吧,有一项你习焉不察的鹅厂黑科技——QQ截屏,保存类型选择JPEG,文件名为”张三2.jpg“。然后把截屏的照片存入人脸注册指定文件夹,终于可以识别了。
下面我们就通过代码方式来修改图片文件为JPG。
package com.interjoy.jardemo;
import java.io.bufferedoutputstream;
import java.io.file;
import java.io.fileinputStream;
import java.io.fileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import androID.graphics.Bitmap;
import androID.graphics.BitmapFactory;
import androID.text.TextUtils;
import androID.util.ArrayMap;
import androID.util.Log;
/**
Title:
Description: 主要用于图片格式转换bmp/png–>JPG
Company: 北京xxxx科技有限公司,support@interjoy.com.cn
@author Created by ylwang on 2018/1/24
*/
public class PicUtils {
private static final String TAG = “PicUtils”;
private static final String PNG = “png”;
private static final String JPG = “jpg”;
private static final String JPEG = “jpeg”;
private static final String BMP = “bmp”;
// private static final String[] imgSuffixes = {PNG, JPG, JPEG, BMP};
private static final List fileSuffixes = Arrays.asList(PNG, JPG, JPEG, BMP);
// 缓存文件头信息-文件头信息
private static final ArrayMap<String, String> mfileTypes = new ArrayMap<String, String>();
static {
// images
mfileTypes.put(“FFD8FFE0”, JPG);
mfileTypes.put(“89504E47”, PNG);
mfileTypes.put(“424D5A52”, BMP);
}
/**
指定文件夹中的图片文件转成JPG格式@param dir 图片的所在文件夹路径*/
public static voID imgToJPG(file dir) {
file[] files = dir.Listfiles();
String filePath = “”;
for (int i = 0; i < files.length; i++) {
//先通过后缀名,过滤非图片
String fileType = files[i].getname().substring(files[i].getname().lastIndexOf(’.’) + 1);
if (fileSuffixes.contains(fileType.tolowerCase())) {
filePath = files[i].getPath();
String imgType = mfileTypes.get(getfileheader(filePath)); //获取真正的文件头
if (!TextUtils.isEmpty(imgType) && !imgType.equals(JPG)) {
convertToJpg(filePath, filePath.substring(0, filePath.lastIndexOf(’.’) + 1) + JPG);
}
}
}
}
/**
转换成JPG格式图片 并将原照片删除@param pngfilePath png或者bmp照片@param jpgfilePath jpg照片*/
private static voID convertToJpg(String pngfilePath, String jpgfilePath) {
Bitmap bitmap = BitmapFactory.decodefile(pngfilePath);
try {
bufferedoutputstream bos = new bufferedoutputstream(new fileOutputStream(jpgfilePath));
if (bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos)) {
bos.flush();
}
bos.close();
} catch (IOException e) {
e.printstacktrace();
} finally {
bitmap.recycle();
bitmap = null;
}
//删除非JPG照片
if (!pngfilePath.equals(jpgfilePath)) {
file oldimg = new file(pngfilePath);
oldimg.delete();
}
}
/**
根据文件路径获取文件头信息@param filePath 文件路径@return 文件头信息*/
private static String getfileheader(String filePath) {
fileinputStream is = null;
String value = null;
try {
is = new fileinputStream(filePath);
byte[] b = new byte[4];
is.read(b, 0, b.length);
value = bytesToHexString(b);
is.close();
} catch (IOException e) {
e.printstacktrace();
}
return value;
}
/**
将要读取文件头信息的文件的byte数组转换成string类型表示@param src 要读取文件头信息的文件的byte数组@return 文件头信息*/
private static String bytesToHexString(byte[] src) {
StringBuilder builder = new StringBuilder();
if (src == null || src.length <= 0) {
return “”;
}
for (int i = 0; i < src.length; i++) {
// 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写
String hv = Integer.toHexString(src[i] & 0xFF).toupperCase();
if (hv.length() < 2) {
builder.append(0);
}
builder.append(hv);
}
return builder.toString();
}
}
————————————————
原文链接:https://blog.csdn.net/iblade/article/details/79153769
总结以上是内存溢出为你收集整理的Android图片格式转换为JPG全部内容,希望文章能够帮你解决Android图片格式转换为JPG所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)