在做人脸识别项目中,首先需要注册人脸,目前程序要求在指定的文件夹存入文件格式为JPG的图片即完成人脸注册。使用中,部分用户对JPG格式理解不深,误以为只要以“.JPEG”或者“.jpg”结尾的图片就是JPG格式,甚至有用户还特意把“张三 .png”改成“张三.jpg”伪装成JPG格式来满足要求。
其实文件扩展名(.jpg)与文件格式无关,是人们为了便于区分,强加的扩展名。就像linux系统里文件根本就没有扩展名的。那么如何通过代码判断该图片文件是否是JPG呢?我们需要了解图片文件的存储,bmp,jpg,png图片存储差异很大,但是归结起来主要分为三部分:文件头,调色板,数据区;我们可以通过读取文件头来判断该文件的格式,最后会按照这种思路封装的一个工具类,主要用于bmp,png转换成JPG。
如何快速确认一张图片的文件格式呢?其实任意一款文本编辑器都可以读取文件头,下面以EditPlus为例;选中图片右键用EditPlus打开(弹框,选择“否”),然后一堆乱码出来了,然后从乱码里寻找下文件头即可。下面三张扩展名均为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相关推荐

  1. TF之VGG系列:利用预先编制好的脚本data_convert .py文件将图片格式转换为tfrecord 格式

    TF之VGG系列:利用预先编制好的脚本data_convert .py文件将图片格式转换为tfrecord 格式 目录 转换代码 转换后的结果 转换代码 python data_convert2tfr ...

  2. 【将图片格式转换为调色盘模式——语义分割】

    将图片格式转换为调色盘模式 转换为调色盘格式 检查调色盘是否正确(检查语义分割的类标签是否正确) 在做语义分割时,复现GitHub代码,出现了语义类标签随机的问题,最终定位到是转换为调试盘时没有统一调 ...

  3. 常用图标png、ico 图标下载,图片格式转换为ico

    网上找到几个不错的免费下载地址: 1.http://www.easyicon.net/ 2.http://588ku.com/sucai/ 3.http://www.iconpng.com 可以直接下 ...

  4. android图片格式

    * android图片格式 * 目前移动端Android平台原生支持的图片格式主要有:JPEG.PNG.GIF.BMP和WebP(自从android4.0开始支持),但是在Android应用开发中能够 ...

  5. js 图片格式转换为jpg_如何将图像转换为JPG格式

    js 图片格式转换为jpg Many websites have strict rules that limit the size and type of image format you're al ...

  6. 怎么用class引入svg_利用AI工具,将图片格式转换为SVG格式操作

    这几天,有读者留言,问怎么把图片转换为SVG格式,网上有在线转换的工具,百度搜索下,就能找到好几个网站提供这样的服务,简单的图片可以,有些复杂的图片输出后有点问题,这个需要大家自行测试,这里就不推荐哪 ...

  7. android 图片格式 xvg,大势所趋,应用如何适配Android P HEIF图片格式

    谷歌公布,Android P 版本支持HEIF格式图片.HEIF 全称为 High Efficiency Image Format,即高效率图片格式.相比于 JPEG 等目前互联网通用的图片格式,HE ...

  8. 使用python将图片格式转换为ico格式

    因为python打包的时候需要用到ico图片格式,网上看好的图片又没有ico,于是自己寻找了一下python转换图片格式的方法,彻底解决这个问题,以后就可以自己轻松实现转化了,代码如下: " ...

  9. 如何将图片格式转换为ico格式

    文章目录 1. 按 2. 代码 1. 按 很多时候我们需要用到ico格式的图片,网上看好的图片又没有ico格式的,于是自己就写了段python3的代码用于解决转换图片格式的问题.不会跑代码怎么办?我发 ...

最新文章

  1. 7.Odoo产品分析 (二) – 商业板块(3) –CRM(1)
  2. 震惊:菲律宾总统咧嘴冷笑视察惨剧!
  3. 负债十五万左右,信用卡十万,网贷四五万,怎么上岸?
  4. P2842-LJJ算数【数论,快速幂】
  5. Tomcat启动时项目重复加载,导致资源初始化两次的问题
  6. linux mysql5.7.18多实例_mysql5.7.13二进制包安装多实例
  7. JAVA和JAVAC 命令行
  8. 分布式存储系统学习笔记(二)—分布式文件系统(3)—Facebook文件系统(Haystack)
  9. Pandas高级教程之:时间处理
  10. 个人笔记-C#txt文本分割器
  11. kindle刷机ttl_#原创新人#艰难的TTL刷机路--新固件斐讯 K1 无线路由刷机教程
  12. 基于java宠物商店管理系统(java毕业设计)
  13. RTT移植STM32之创建进程
  14. 网站SEO诊断优化有那些不利操作
  15. LeetCode-55. 跳跃游戏
  16. 受汉城改名鼓舞,世界各地掀起改名热潮,尤其是那个小日本(笑话)
  17. python自动化测试selenium(四)切换页面、切换窗口
  18. SCIENCE CHINA LATEX模板缺少的一个重要文件psfig.sty,File `picins.sty’ not found.
  19. PSD文件误删了怎么恢复?教你三招
  20. 计算机科学与技术是学什么的1001无标题,计算机科学与技术学院计科1001.doc

热门文章

  1. 计算机软件系统崩溃,系统崩溃了怎么办 如何快速还原崩溃的系统【步骤方法】...
  2. foobar2000_修复了在Foobar2000中找不到设备(0x88780078)
  3. Android 微信登录详细流程
  4. 热门的2B企业服务,资本是如何解读和判断的
  5. 字符串哈希--聪聪的加法等式
  6. 微前端:使用qiankun框架从 0-1 搭建vue构成微前端项目
  7. 【编译原理】:如何将控制语句翻译成四元式
  8. html js 在线预览 pdf word xls等
  9. 钉钉网页直播回放添加控件(倍速)脚本
  10. 自用版:客服话术大全