把安卓動態圖片拆分(分解、分開)成圖片和視頻兩個文件(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
版權屬於:zgcwkj
本文鏈接:https://www.zgcwkj.com/archives/246.html
轉載聲明:請注明本文章的標題及內容的出處和聲明,謝謝
評論已關閉