图片转码 webp 转 png、jpg

本文介绍了如何使用Java工具处理安卓上传的图片,使其能在iOS设备上正常显示。通过修改图片头部信息,解决了不同平台图片格式不兼容的问题,重点在于ImageUtils工具类的实现和文件头识别技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近项目遇到一个问题,安卓上传的图片,IOS看不了,IOS呢 又不愿意更新图片展示框架,所以,只有安卓这边做处理啦。开始直接修改图片后缀,但是发现并不能解决问题,后面通过解析图片的头部文件,修改头部文件类型,就可以了。

下面是工具类:

package com.xxxx.review.activity.issue;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.text.TextUtils;
import android.util.ArrayMap;

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;

/**
 * 2022-02-16
 * 文件转换为 JPG
 */
public class ImageUtils {

    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<String> 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);
    }

    public static void ImageToJPGList(List<String> dirs) {
        for (int i = 0; i < dirs.size(); i++) {
            ImgToJPG(new File(dirs.get(i)));
        }
    }

    /**
     * 指定文件夹中的图片文件转成JPG格式
     *
     * @param dir 图片的所在文件夹路径
     */
    public static void ImgToJPG(File dir) {
        String filePath = "";
        //先通过后缀名,过滤非图片
        String fileType = dir.getName().substring(dir.getName().lastIndexOf('.') + 1);
        if (fileSuffixes.contains(fileType.toLowerCase())) {
            filePath = dir.getPath();
            String imgType = mFileTypes.get(getFileHeader(filePath)); //获取真正的文件头
            convertToJpg(filePath, filePath.substring(0, filePath.lastIndexOf('.') + 1) + JPG);
            /*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();
    }
}

<think>好的,用户想了解如何将WebP格式的图片换为PNG格式。首先,我需要回顾一下WebPPNG这两种格式的特点。WebP是由Google开发的,旨在提供更高的压缩效率,同时保持较高的图像质量,支持有损和无损压缩以及透明度。而PNG是一种广泛使用的无损压缩格式,支持透明度,兼容性更好,尤其是在旧版软件或系统中。 接下来,用户的需求可能涉及多个方面。他们可能遇到了兼容性问题,比如某些应用程序不支持WebP格式,或者需要编辑图片时软件无法处理WebP。也有可能他们需要保留透明度,或者希望在不损失质量的情况下换格式。需要明确的是,WebP在压缩率上优于PNG,但换到PNG可能会增加文件大小。 接下来,我需要考虑不同的换方法,以满足不同用户的技术水平和使用场景。首先是在线换工具,这对普通用户来说最方便,无需安装软件。常见的工具有CloudConvert、Online-Convert、Zamzar等。需要提醒用户注意隐私问题,不建议处理敏感图片。 然后是桌面软件,适合需要频繁换或处理大量文件的用户。例如,GIMP和Photoshop这样的专业图像处理软件都支持导出为PNG。另外,像XnConvert这样的批量换工具也很实用。对于不同操作系统,如macOS的预览应用也可以另存为PNG。 命令行工具适合开发人员或喜欢自动化的用户。ImageMagick的convert命令非常强大,可以批量处理。ffmpeg虽然主要用于视频,但也能处理图像换。这些工具需要一定的技术基础,但效率很高。 移动应用方面,安卓和iOS都有相应的图片换应用,方便用户在手机上直接操作。 在换过程中需要注意的事项包括:保持图像质量,尤其是从有损WebP换到PNG时,质量不会提升,但可以避免进一步损失。透明度支持方面,需确保换工具正确处理Alpha通道。另外,批量换能节省时间,特别是处理大量图片时。 最后,可能需要解释为什么需要换。例如,兼容性问题,或者编辑需求,或者某些平台要求特定格式。用户可能没有意识到换后的文件大小变化,需要提前说明,避免意外。 总结下来,需要分步骤介绍多种方法,覆盖不同用户群体,同时提醒注意事项,确保用户能根据自身情况选择最适合的方式,并正确完成换。</think>将WebP格式换为PNG格式的步骤如下: --- ### 一、WebPPNG格式对比 1. **WebP特性** - 谷歌开发的图像格式,压缩率比PNG高约26% - 支持有损/无损压缩、透明度(Alpha通道)和动画 - 兼容性问题:旧版软件可能不支持 2. **PNG特性** - 无损压缩格式,广泛兼容所有设备和软件 - 支持透明背景,适合图形和图标 --- ### 二、换方法详解 #### 方法1:在线换工具(适合普通用户) 1. **推荐平台** - [CloudConvert](https://cloudconvert.com/webp-to-png) - [Online-Convert](https://www.online-convert.com/) - [Zamzar](https://www.zamzar.com/convert/webp-to-png/) 2. **操作步骤** ``` 1. 上传WebP文件 2. 选择输出格式为PNG 3. 下载换后的文件 ``` **注意**:敏感图片建议使用本地工具避免隐私风险 --- #### 方法2:桌面软件(适合批量处理) 1. **GIMP(跨平台开源工具)** - 步骤: ``` 文件 → 打开 → 选择WebP → 文件 → 导出为 → 重命名扩展名为.png → 确认 ``` 2. **XnConvert(批量处理工具)** - 支持Windows/macOS/Linux - 可一次性换数百个文件 3. **macOS预览应用** - 双击打开WebP → 顶部菜单栏 → 文件 → 导出 → 选择PNG格式 --- #### 方法3:命令行工具(适合开发者) 1. **ImageMagick(需先安装)** ```bash # 单文件换 convert input.webp output.png # 批量换(当前目录所有.webp文件) mogrify -format png *.webp ``` 2. **FFmpeg** ```bash ffmpeg -i input.webp output.png ``` --- #### 方法4:移动端应用 1. **Android**:*Photo Converter*、*Format Factory* 2. **iOS**:*Image Converter*、*File Converter* --- ### 三、关键注意事项 1. **透明度保留** - 检查换后的PNG是否保留Alpha通道(可用Photoshop查看图层) 2. **质量对比** - WebPPNG时文件大小会增大,但画质无损 - 换公式:$$ \text{PNG大小} \approx \frac{\text{WebP大小}}{0.7} $$(估算值) 3. **批量处理优化** - 使用XnConvert或ImageMagick时,可设置压缩级别(例如PNG-8优化色彩索引) --- ### 四、典型问题解决 - **报错"无法打开.webp文件"** → 更新图像查看器/编辑器至最新版 - **换后模糊** → 原始WebP为有损压缩,换无法恢复原始画质 选择最适合您技术场景的方法即可完成格式换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值