拆分安卓動態圖片

@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