Unity保存图片到相册

2023-11-20

Unity保存图片到Android相册

Java] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

package com.xuefei.game;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import com.unity3d.player.UnityPlayerNativeActivity;

import android.content.Context;

import android.content.Intent;

import android.graphics.Bitmap;

import android.graphics.Bitmap.CompressFormat;

import android.graphics.BitmapFactory;

import android.net.Uri;

import android.os.Bundle;

import android.os.Environment;

import android.util.Log;

import android.widget.Toast;

public class MainActivity extends UnityPlayerNativeActivity {

    public static Context context;

    public static MainActivity mainActivity;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        mainActivity = this;

    }

    // 保存到相册

    public static void savePng(final String fileName) {

        context = mainActivity.getApplicationContext();

        mainActivity.runOnUiThread(new Runnable() {

            public void run() {

                Bitmap bitmap = BitmapFactory.decodeFile(Environment

                        .getExternalStorageDirectory()

                        + "/Android/data/com.xuefei.game/files/"

                        + fileName

                        + ".png");

                File file = new File(Environment.getExternalStorageDirectory()

                        + "/DCIM/Camera", fileName + ".jpg");

                FileOutputStream fos = null;

                try {

                    fos = new FileOutputStream(file);

                } catch (FileNotFoundException e) {

                    // TODO Auto-generated catch block

                    Log.w("cat", e.toString());

                }

                bitmap.compress(CompressFormat.JPEG, 100, fos);

                try {

                    fos.flush();

                } catch (IOException e) {

                    // TODO Auto-generated catch block

                    Log.w("cat", e.toString());

                }

                try {

                    fos.close();

                } catch (IOException e) {

                    // TODO Auto-generated catch block

                    Log.w("cat", e.toString());

                }

                bitmap.recycle();//扫描保存的图片

                context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" +Environment.getExternalStorageDirectory()

                        + "/DCIM/Camera/"+fileName + ".jpg")));

                 

                Toast.makeText(context, "照片已保存到相册", Toast.LENGTH_SHORT).show();

  

            }

        });

    }

}



Unity中代码:

[C#] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

if (GUI.Button(new Rect(0, 720, 400, 120), "SavePng"))

        {

            StartCoroutine(SavePngToSD(DateTime.Now.ToFileTime().ToString()));

        }

/// <summary>

    /// 截图后先检测图片是否保存成功然后调用保存到相册

    /// </summary>

    /// <param name="name"></param>

    public void SavePng(string name)

    {

#if UNITY_ANDROID

        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");

        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");

        jo.CallStatic("SavePng", name);

#elif  UNITY_IPHONE

#endif

    }

/// <summary>

    /// 保存截图到相册

    /// </summary>

    /// <param name="pngName"></param>

    /// <returns></returns>

    IEnumerator SavePngToSD(string pngName)

    {

        yield return new WaitForEndOfFrame();

        Application.CaptureScreenshot(pngName + ".png");

        while (!IsFileExistByPath(Application.persistentDataPath + "/" + pngName + ".png"))

        {

            yield return new WaitForSeconds(0.05f);

        }

        SavePng(pngName);

        yield return new WaitForSeconds(0.3f);

        //测试请求文件

        WWW www = new WWW("file:///" + Application.persistentDataPath + "/" + pngName + ".png");

        yield return www;

    }

    /// <summary>

    /// 检测文件是否存在

    /// </summary>

    /// <param name="path"></param>

    /// <returns></returns>

    public static bool IsFileExistByPath(string path)

    {

        FileInfo info = new FileInfo(path);

        bool b = false;

        if (info == null || info.Exists == false)

        {

            b = false;

        }

        else

        {

            b = true;

        }

        return b;

    }


注意文件路径是否存在,不存在就创建


流程:Unity截屏--调用安卓拷贝到相册--扫描保存的文件

解决的问题:截屏图片在相册不显示。

Unity截屏插入iOS相册 

[C#] 纯文本查看 复制代码

?

 

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

using System;

using System.IO;

 

#if UNITY_IOS

using System.Runtime.InteropServices;

#endif

 

using UnityEngine;

 

public class UnityPlugins : MonoBehaviour

{

 

    // Use this for initialization

    void Start()

    {

 

    }

 

    // Update is called once per frame

    void Update()

    {

 

    }

 

    #if UNITY_IOS

    [DllImport("__Internal")]

    private static extern void _SavePhoto(string readAddr);

    #endif

 

    string path = "";

 

    private void OnGUI()

    {

 

        if (GUILayout.Button("TakePhoto", GUILayout.Height(300), GUILayout.Width(300)))

        {

            CaptureCamera();

            Debug.Log("TakePhoto");

        

    }

 

 

    void CaptureCamera()

    {

        Camera camera = Camera.main;

        string name = DateTime.Now.ToFileTime().ToString();

 

        Rect rect = new Rect(0, 0, Screen.width, Screen.height);

 

        RenderTexture rt = new RenderTexture(Screen.width, Screen.height, 0);

        Texture2D frame = new Texture2D(Screen.width, Screen.height, TextureFormat.RGBA32, false);

 

        camera.targetTexture = rt;

        camera.Render();

 

        RenderTexture.active = rt;

        frame.ReadPixels(rect, 0, 0);

        frame.Apply();

 

        camera.targetTexture = null

        RenderTexture.active = null;  

 

        byte [] bytes = frame.EncodeToJPG();

 

        File.WriteAllBytes(Application.persistentDataPath + "/" + name + ".jpg",bytes);

 

        #if UNITY_IOS

        _SavePhoto(Application.persistentDataPath + "/" + name + ".jpg");

        #endif

    }

 

}




iOS代码

[AppleScript] 纯文本查看 复制代码

?

 

1

2

3

4

5

#import <Foundation/Foundation.h> 

    

@interface UnityPlugins : NSObject 

- ( void ) imageSaved: ( UIImage *) image didFinishSavingWithError:( NSError *)error  

    contextInfo: ( void *) contextInfo; 

@end



 

[AppleScript] 纯文本查看 复制代码

?

 

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

#import "UnityPlugins.h" 

@implementation UnityPlugins 

- ( void ) imageSaved: ( UIImage *) image didFinishSavingWithError:( NSError *)error  

    contextInfo: ( void *) contextInfo 

{ 

    NSLog(@"保存结束")

    if (error != nil) { 

        NSLog(@"有错误")

    } 

} 

void _SavePhoto(char *readAddr) 

{ 

    NSString *strReadAddr = [NSString stringWithUTF8String:readAddr]; 

    UIImage *img = [UIImage imageWithContentsOfFile:strReadAddr]; 

    NSLog([NSString stringWithFormat:@"w:%f, h:%f", img.size.width, img.size.height])

    UnityPlugins *instance = [UnityPlugins alloc]; 

    UIImageWriteToSavedPhotosAlbum(img, instance,  

        @selector(imageSaved:didFinishSavingWithError:contextInfo:), nil)

} 

@end




目录结构
 


导出Xcode工程后或者  修改Info.plist  打开 Info.plist,点击 + 号,在 Key 中输入:Privacy - Photo Library Additions Usage Description,Type 选择 String,Value 中输入你的提示语(比如XXX访问相册)再次 Build

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity保存图片到相册 的相关文章

随机推荐

  • 朋友月薪3000,靠 Python 做副业月入过万!

    被压垮的打工人 你还好吗 房贷车贷 上老下小 日常开销 但你的收入有多少 所以你不敢生病 甚至不敢回家 就为了每个月那么点死工资 还得天天加班 然而忙忙忙 却变成了 穷忙族 成为了职场废人 朋友在事业单位工作 事少离家近 收入也很稳定 但她
  • java ftp 域名解析_域名系统DNS和FTP

    域名系统概述 域名系统DNS Domain Name System 是英特网使用的命名系统 用于把便于人们使用机器名字转化为IP地址 为什么机器在处理IP数据报时要使用IP地址而不使用域名呢 IP地址长度固定 而域名长度不固定 机器处理起来
  • 2-11寻找链表中的环

    题目描述 传入一个头节点判断链表是否有环 如果有环返回第一个入环的节点 如果没有环返回null 解题方法1 可以使用哈希表来完成 每遍历一个节点就把该节点的引用存储到哈希表 如果哈希表中出现了重复的引用 那么那个重复的引用就是第一个入环的节
  • vue-lazyload基础实例(基于vue2.0和vue-router2.0)

    首先引入依赖 import Vue from vue import Router from vue router import VueLazyload from vue lazyload 配置vue lazyload Vue use Vue
  • 关于使用vue安装项目的时候出现了 command failed: pnpm install --reporter silent --shamefully-hoist 报错

    依靠 pnpm 使用脚手架创建 vue 项目时 出现了 command failed pnpm install reporter silent shamefully hoist 奇葩的报错 寻查无果 后觉察到是由于我使用的文件系统不支持硬链
  • 标题Ant Design of Vue 组件库中Modal“确认“按钮和“取消“按钮成英文状态

    标题Ant Design of Vue 组件库中Modal 确认 按钮和 取消 按钮成英文状态 因为是国际化的原因 造成确定按钮和取消按钮变成英文 需要设置 okText 与 cancelText 以自定义按钮文字 div div
  • Battery Charging Specification(BC1.2) 和 QC2.0 笔记

    BC2 说明 参数说明 标准检测流程 VBUS检测 VBUS Detect PD 移动设备 中有个检测VBUS是否有效的电路 电路有一个参考值 高于这个值就认为是VBUS有效了 这个参考值不是固定的 设计的时候保证它在0 8V 4V之间就可
  • [机器学习与scikit-learn-20]:算法-逻辑回归-线性逻辑回归linear_model.LogisticRegression与代码实现

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 机器学习与scikit learn 20 算法 逻辑回归 线性逻辑回归linear model LogisticRegression与代码实
  • Web服务器群集:LVS+Keepalived高可用群集

    目录 一 理论 1 Keepalived 2 VRRP协议 虚拟路由冗余协议 3 部署LVS Keepalived 高可用群集 二 实验 1 LVS Keepalived 高可用群集 三 问题 1 备服务器网卡启动报错 四 总结 一 理论
  • 平衡二叉排序树插入结点的学习总结

    最近写了平衡二叉排序树代码 在这里对自己的理解做一下总结 下面的文字 更多的是把我自己的遇到的理解上的问题和思路讲清楚 可能不能让你一下就看明白 这是我的问题 网上其实有很多写的很好的文章 我也是学他们的 然后通过写文章来考研自己是不是真的
  • Redis之坑:Redis与MySQL中事务的区别

    Redis之坑 spring data redis中的Redis事务 Redis之坑 理解Redis事务 Redis之坑 Redis与MySQL中事务的区别 Transaction之坑 数据库事务 Transaction之坑 Spring中
  • 【模型剪枝】——开源项目总结

    修剪是一种常用的压缩神经网络模型的技术 修剪方法探索模型权重 参数 中的冗余 并尝试删除 修剪冗余和非关键权重 冗余元素从模型中修剪 它们的值归零 我们确保它们不参与反向传播过程 pytorch pruning https github c
  • 设置定时任务为每天凌晨2点执行和每小时执行一次?

    每天凌晨2点 0 0 2 和每天隔一小时 0 1 例1 每隔5秒执行一次 5 例2 每隔5分执行一次 0 5 在26分 29分 33分执行一次 0 26 29 33 例3 每天半夜12点30分执行一次 0 30 0 注意日期域为0不是24
  • axure9怎么让页面上下滑动_Axure动态面板(上下左右滑动页面)

    手机端交互中 页面的上下左右滑动是常用的交互形态 今天给大家分享一下如何使用Axure来进行模拟 这里使用动态面板来实现 如果对动态面板不是很了解的同学 请查看专栏里的 动态面板入门教程 先看效果 开工之前我们我们先分析一下 滑动效果的用处
  • 利用Android Lost通过互联网或短信远程控制安卓设备

    利用Android Lost通过互联网或短信远程控制安卓设备 作者 Jack Wallen 杰克 瓦伦翻译 PurpleEndurer 2014 11 15第1版 使用智能手机要考虑的一个至关重要的因素是安全性 当然 安全问题不仅仅存在于平
  • java springboot -- MultipartFile -图片上传到远程服务器上

    新增文件 param file return private boolean saveFile MultipartFile file try 文件保存路径 String filePath A merchant 映射的地址 String fi
  • Springboot+vue+hadoop+java图书个性化推荐系统

    前台首页功能模块 3 1首页 图书个性化推荐系统 在前台首页可以查看首页 图书信息 好书推荐 留言反馈 个人中心 后台管理等内容 如图 3 2图书信息 在图书信息页面通过查看图书编号 图书名称 图书类别 图片 作者 出版社 版次 数量 点击
  • 背单词(持续更新)

    文章目录 星火雅思周计划 229 复习 考研 352 353 职场俚语 1 2 7分 1 2 3 4 5 6 7 8 haochi fun 1 2 GRE 1 2 托福 249 247 248 245 246 243 244 241 242
  • 3WebGL shader准备工具

    VSCode安装 VSCode 全称 Visual Studio Code 是一款由微软开发且跨平台的免费源代码编辑器 该软件支持语法高亮 代码自动补全 又称 IntelliSense 代码重构 查看定义功能 并且内置了命令行工具和 Git
  • Unity保存图片到相册

    Unity保存图片到Android相册 Java 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28