1
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
## 1.0.2(2025-07-25)
|
||||
* 兼容原生鸿蒙
|
||||
## 1.0.1(2025-02-10)
|
||||
* 兼容所有平台
|
||||
## 1.0.0(2024-11-21)
|
||||
* 将base64对象转换为图片文件PNG格式
|
||||
@@ -0,0 +1,83 @@
|
||||
{
|
||||
"id": "x-base642file-s",
|
||||
"displayName": "x-base642file-s",
|
||||
"version": "1.0.0",
|
||||
"description": "x-base642file-s",
|
||||
"keywords": [
|
||||
"x-base642file-s"
|
||||
],
|
||||
"repository": "",
|
||||
"engines": {
|
||||
"HBuilderX": "^3.6.8"
|
||||
},
|
||||
"dcloudext": {
|
||||
"type": "uts",
|
||||
"sale": {
|
||||
"regular": {
|
||||
"price": "0.00"
|
||||
},
|
||||
"sourcecode": {
|
||||
"price": "0.00"
|
||||
}
|
||||
},
|
||||
"contact": {
|
||||
"qq": ""
|
||||
},
|
||||
"declaration": {
|
||||
"ads": "",
|
||||
"data": "",
|
||||
"permissions": ""
|
||||
},
|
||||
"npmurl": ""
|
||||
},
|
||||
"uni_modules": {
|
||||
"dependencies": [],
|
||||
"encrypt": [],
|
||||
"platforms": {
|
||||
"cloud": {
|
||||
"tcb": "u",
|
||||
"aliyun": "u",
|
||||
"alipay": "u"
|
||||
},
|
||||
"client": {
|
||||
"Vue": {
|
||||
"vue2": "u",
|
||||
"vue3": "u"
|
||||
},
|
||||
"App": {
|
||||
"app-android": "u",
|
||||
"app-ios": "u",
|
||||
"app-harmony": "u"
|
||||
},
|
||||
"H5-mobile": {
|
||||
"Safari": "u",
|
||||
"Android Browser": "u",
|
||||
"微信浏览器(Android)": "u",
|
||||
"QQ浏览器(Android)": "u"
|
||||
},
|
||||
"H5-pc": {
|
||||
"Chrome": "u",
|
||||
"IE": "u",
|
||||
"Edge": "u",
|
||||
"Firefox": "u",
|
||||
"Safari": "u"
|
||||
},
|
||||
"小程序": {
|
||||
"微信": "u",
|
||||
"阿里": "u",
|
||||
"百度": "u",
|
||||
"字节跳动": "u",
|
||||
"QQ": "u",
|
||||
"钉钉": "u",
|
||||
"快手": "u",
|
||||
"飞书": "u",
|
||||
"京东": "u"
|
||||
},
|
||||
"快应用": {
|
||||
"华为": "u",
|
||||
"联盟": "u"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
# x-base642file-s
|
||||
|
||||
### 功能介绍
|
||||
|
||||
将Base64格式的图片数据转换为本地PNG文件,支持跨平台使用。
|
||||
|
||||
### 兼容性
|
||||
|
||||
| Harmony | IOS | Android | WEB | 小程序 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 支持 | 支持 | 支持 | 支持 | 支持 |
|
||||
|
||||
### API文档
|
||||
|
||||
#### toPngFile
|
||||
|
||||
`toPngFile(data: string): Promise<string>`
|
||||
将Base64格式的图片数据转换为本地PNG文件。
|
||||
|
||||
**参数说明:**
|
||||
- data: Base64格式的图片数据字符串,支持带前缀(如:data:image/png;base64,)或纯Base64字符串
|
||||
|
||||
**返回值:**
|
||||
- `Promise<string>`: 返回生成的PNG文件路径
|
||||
- 成功:resolve(文件路径)
|
||||
- 失败:reject(空字符串)
|
||||
|
||||
### 平台差异说明
|
||||
|
||||
- Android:文件保存在应用的外部缓存目录
|
||||
- iOS:文件保存在应用的缓存目录
|
||||
- Web:返回Blob URL
|
||||
- 小程序:文件保存在小程序用户目录
|
||||
|
||||
### 使用示例
|
||||
|
||||
```ts
|
||||
|
||||
import { toPngFile } from "@/uni_modules/x-base642file-s"
|
||||
|
||||
// 示例:将Base64图片转换为本地文件
|
||||
const convertToFile = async (base64Data: string) => {
|
||||
try {
|
||||
const filePath = await toPngFile(base64Data)
|
||||
console.log('文件保存成功:', filePath)
|
||||
} catch (error) {
|
||||
console.error('转换失败')
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 注意事项
|
||||
|
||||
1. 使用前,Windows用户需要先在页面引用,打基座,再编译使用
|
||||
2. Mac用户可直接引用使用
|
||||
3. 建议在处理大量数据时进行适当的性能优化
|
||||
4. 生成的文件会保存在各平台对应的缓存目录中,请注意及时清理不需要的文件
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"minSdkVersion": "21"
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
import Context from "android.content.Context"
|
||||
import Bitmap from "android.graphics.Bitmap"
|
||||
import BitmapFactory from "android.graphics.BitmapFactory"
|
||||
import Base64 from "android.util.Base64"
|
||||
import File from "java.io.File"
|
||||
import FileOutputStream from "java.io.FileOutputStream"
|
||||
|
||||
export function toPngFile(data : string) : Promise<string> {
|
||||
let fileName = Math.random().toString(16).substring(2, 16)
|
||||
let baesestrAr = data.split(',') as string[]
|
||||
let base64Data = baesestrAr[1]
|
||||
let fileUrl = ''
|
||||
|
||||
try {
|
||||
let context = UTSAndroid.getAppContext()!
|
||||
let filepath = context.getExternalCacheDir()?.getPath() ?? ""
|
||||
// 解码Base64字符串
|
||||
let decodedBytes = Base64.decode(base64Data, Base64.DEFAULT)
|
||||
let bitmap = BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.size)
|
||||
let file = new File(filepath, fileName + '.png');
|
||||
|
||||
let fos = new FileOutputStream(file)
|
||||
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
|
||||
fileUrl = file.getPath();
|
||||
|
||||
} catch (error) {
|
||||
console.error('处理图片错误:', error)
|
||||
//TODO handle the exception
|
||||
return Promise.reject(fileUrl) as Promise<string>
|
||||
}
|
||||
|
||||
return Promise.resolve(fileUrl)
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"x_library_s": "./lib/x_library_s.har"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
import { x_toPngFile } from "x_library_s";
|
||||
import { BusinessError } from "@kit.BasicServicesKit";
|
||||
|
||||
export function toPngFile(data : string) : Promise<string> {
|
||||
try {
|
||||
const file = x_toPngFile(UTSHarmony.getCurrentWindow()!.getUIContext(),data)
|
||||
return Promise.resolve(file);
|
||||
} catch (error) {
|
||||
const e = error as BusinessError;
|
||||
console.error("TMUI",e.message)
|
||||
return Promise.reject(e.message);
|
||||
}
|
||||
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>NSPrivacyAccessedAPITypes</key>
|
||||
<array/>
|
||||
<key>NSPrivacyCollectedDataTypes</key>
|
||||
<array/>
|
||||
<key>NSPrivacyTracking</key>
|
||||
<false/>
|
||||
<key>NSPrivacyTrackingDomains</key>
|
||||
<array/>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"deploymentTarget": "12"
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
import { Data } from 'Foundation';
|
||||
import { UIImage } from 'UIKit';
|
||||
export function toPngFile(data : string):Promise<string> {
|
||||
let fileName = Math.random().toString(16).substring(2,16)
|
||||
let baesestrAr = data.split(',') as string[]
|
||||
let base64Data = baesestrAr[1]
|
||||
let imageData = new Data(base64Encoded = base64Data)
|
||||
if(imageData==null) return Promise.reject('') as Promise<string>
|
||||
let image = new UIImage(data = imageData!)
|
||||
if(image==null) return Promise.reject('') as Promise<string>
|
||||
let userDir = FileManager.default.urls(for = FileManager.SearchPathDirectory.cachesDirectory, in = FileManager.SearchPathDomainMask.userDomainMask).first!
|
||||
let destinationFileName = fileName + ".png"
|
||||
let fileURL = userDir.appendingPathComponent(destinationFileName)
|
||||
|
||||
let isSuccess = UTSiOS.try(imageData!.write(to =fileURL),"?")
|
||||
if(isSuccess==null) return Promise.reject('') as Promise<string>
|
||||
|
||||
return Promise.resolve(fileURL.path)
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
export function toPngFile(data : string) : Promise<string> {
|
||||
let bdataBase64 = data.split(',')[1]
|
||||
let fileMg = wx.getFileSystemManager();
|
||||
let filepath = `${wx.env.USER_DATA_PATH}/${Math.random().toString(16).substring(4, 20)}.png`
|
||||
return new Promise((res, rej) => {
|
||||
fileMg.writeFile({
|
||||
filePath: filepath,
|
||||
data: bdataBase64,
|
||||
encoding: "base64",
|
||||
success() {
|
||||
res(filepath)
|
||||
},
|
||||
faile() {
|
||||
rej("")
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
// function compressImage(quality:number) : string {
|
||||
// let base64data = canvas.toDataURL('image/jpeg', attrs.compress / 100);
|
||||
// return base64data;
|
||||
// }
|
||||
function base64ToBlob(data : string) : Blob {
|
||||
let bytes = window.atob(data.split(',')[1])
|
||||
let ab = new ArrayBuffer(bytes.length)
|
||||
let ia = new Uint8Array(ab)
|
||||
for (let i = 0; i < bytes.length; i++) {
|
||||
ia[i] = bytes.charCodeAt(i)
|
||||
}
|
||||
// @ts-ignore
|
||||
return new Blob([ab], { type: 'image/jpeg' })
|
||||
}
|
||||
|
||||
// ,quality:number
|
||||
export function toPngFile(data : string) : Promise<string> {
|
||||
let bloblfaile = URL.createObjectURL(base64ToBlob(data));
|
||||
return Promise.resolve(bloblfaile);
|
||||
}
|
||||
Reference in New Issue
Block a user