拆分安卓动态图片

@zgcwkj  2025年03月15日

分类:

代码 其它 

把安卓动态图片拆分(分解、分开)成图片和视频两个文件(golang

源码如下

package main

import (
    "bytes"
    "fmt"
    "os"
    "path/filepath"
    "strings"
)

const (
    jpegStartMarker = "\xFF\xD8\xFF"         // JPEG的开始标记
    jpegEndMarker   = "\xFF\xD9"             // JPEG的结束标记
    mp4StartMarker  = "\x00\x00\x00\x18ftyp" // MP4的开始标记
)

func main() {
    var files []string
    var err error
    // 检查是否有命令行参数(文件拖拽)
    if len(os.Args) > 1 {
        // 使用命令行参数作为文件列表
        files = os.Args[1:]
    } else {
        // 如果没有命令行参数,则搜索当前目录下的MVIMG*.jpg文件
        files, err = filepath.Glob("MVIMG*.jpg")
        if err != nil {
            fmt.Printf("查找文件失败: %v\n", err)
            return
        }
    }
    // 检查是否找到文件
    if len(files) == 0 {
        fmt.Println("未找到要处理的文件")
        fmt.Println("请将MVIMG文件拖到程序上,或将程序放在包含MVIMG文件的目录中运行")
        fmt.Println("按任意键退出...")
        fmt.Scanln() // 等待用户按键
        return
    }
    // 处理每个文件
    for _, file := range files {
        if err := processMVIMGFile(file); err != nil {
            fmt.Printf("处理文件 %s 失败: %v\n", file, err)
            continue
        }
    }
    // 处理完成后等待用户按键
    fmt.Println("\n所有文件处理完成,按任意键退出...")
    fmt.Scanln()
}

// 处理MVIMG文件
func processMVIMGFile(filename string) error {
    // 读取文件内容
    data, err := os.ReadFile(filename)
    if err != nil {
        return fmt.Errorf("读取文件失败: %v", err)
    }
    // 查找JPEG图片部分
    jpegStart := bytes.Index(data, []byte(jpegStartMarker))
    if jpegStart == -1 {
        return fmt.Errorf("未找到JPEG开始标记")
    }
    // 从JPEG开始位置之后查找结束标记
    jpegEndSearchData := data[jpegStart:]
    jpegEndOffset := bytes.Index(jpegEndSearchData, []byte(jpegEndMarker))
    if jpegEndOffset == -1 {
        return fmt.Errorf("未找到JPEG结束标记")
    }
    jpegEnd := jpegStart + jpegEndOffset + 2 // 包含结束标记
    // 查找MP4视频部分
    mp4Start := bytes.Index(data, []byte(mp4StartMarker))
    if mp4Start == -1 {
        return fmt.Errorf("未找到MP4开始标记")
    }
    // 提取文件名(不包含扩展名)
    baseName := strings.TrimSuffix(filename, filepath.Ext(filename))
    // 保存JPEG图片
    jpegFilename := baseName + "_image.jpg"
    if err := os.WriteFile(jpegFilename, data[jpegStart:jpegEnd], 0644); err != nil {
        return fmt.Errorf("保存JPEG文件失败: %v", err)
    }
    fmt.Printf("已保存图片: %s\n", jpegFilename)
    // 保存MP4视频
    mp4Filename := baseName + "_video.mp4"
    if err := os.WriteFile(mp4Filename, data[mp4Start:], 0644); err != nil {
        return fmt.Errorf("保存MP4文件失败: %v", err)
    }
    fmt.Printf("已保存视频: %s\n", mp4Filename)
    // 返回
    return nil
}

下载

源码:MvimgUnpack_Code.7z
程序 Windows_x64:MvimgUnpack_win_amd64.7z
程序 Linux_amd64:MvimgUnpack_linux_amd64.7z
程序 Darwin_amd64:MvimgUnpack_darwin_amd64.7z
程序 Darwin_arm64:MvimgUnpack_darwin_arm64.7z



评论已关闭

Top