如何读取展示assets/resources以外的Documents图片资源(rc.3 )

一、使用过程:
1、先通过js调用c++读取ios相册读取照片,然后保存在iOS 本APP的可写目录Documets目录下,假设名字为img.png。具体路径大致为:/var/mobile/Containers/Data/Application/3456A867-94F1-4997-B758-5F3EEA4F2/Documents/img.png
2、通过c++回调js方法,返回照片地址:/var/mobile/Containers/Data/Application/3456A867-94F1-4997-B758-5F3EEA4F2/Documents/img.png
3、原先使用以下代码实现图片的展示可展示图片:
//更换照片
changeImage: function(url){
var texture = cc.textureCache.addImage(rul);
this.headImg.spriteFrame.setTexture(texture);
}

二、问题:
在最近的creator版本(当前1.2.0-rc3),spriteFrame的api里已不提供setTexture方法,给出的说明如下:
http://www.cocos.com/docs/creator/api/classes/SpriteFrame.html

注意:目前只建议通过以下几个方式进行创建 SpriteFrame:
可以在你的组件上定义一个 SpriteFrame 类型并通过拖动 SpriteFrame 资源进行赋值。
通过 cc.loader.loadRes 或 atlas.getSpriteFrame 来获得 spriteFrame 实例。

因此以上读取保存的相册只能通过cc.loader.loadRes来读取展示,但看了loadRes的API,当前仅读取assets目录下的resources目录下的图片资源。
http://www.cocos.com/docs/creator/api/classes/loader.html#method_loadRes
Load resources from the “resources” folder inside the “assets” folder of your project.

三:请教解决办法
iOS,assets/resources以外的Documents图片资源如何读取展示?

2赞

建议用下面的方法:

changeImage: function(url){
    var sf = new cc.SpriteFrame(url);
    sf.retain();
    this.headImg.spriteFrame = sf;
}

目前这个方法会报一个警告,不过没有关系,可以忽略。在后续版本重构完内存模型后就不会有警告了。

2赞

看API不建议这么使用,所以忽略了该方法,罪过啊
按以上方法已测试通过,感谢。

请问你传进去的url就是这个:/var/mobile/Containers/Data/Application/3456A867-94F1-4997-B758-5F3EEA4F2/Documents/img.png oc返回的路径吗?我也是这样做的,查看了手机沙盒中对应的路径下的图片是存在的,可是用这个方式:
var sf = new cc.SpriteFrame(url);
sf.retain();
this.headImg.spriteFrame = sf;
换图却一直失败

请问传进去的url就是这个:/var/mobile/Containers/Data/Application/3456A867-94F1-4997-B758-5F3EEA4F2/Documents/img.png oc返回的路径吗?我也是这样做的,查看了手机沙盒中对应的路径下的图片是存在的,可是用这个方式:
var sf = new cc.SpriteFrame(url);
sf.retain();
this.headImg.spriteFrame = sf;
换图却一直失败

把这个去掉:sf.retain();

谢谢!问题已解决。

我把这个去掉:sf.retain();了 还是换不了图。贴出了我的代码

showPic: function (filepath, callback) {
cc.log(“showPic jsb.fileUtils.getWritablePath():”, jsb.fileUtils.getWritablePath());
// var dirpath = jsb.fileUtils.getWritablePath() + ‘zzw/’;
// var filepath = dirpath + MD5(url) + ‘.png’;

    function loadEnd() {
        cc.loader.load(filepath, function (err, tex) {
            if (err) {
                cc.error(err);
            } else {
                var spriteFrame = new cc.SpriteFrame(tex);
                if (spriteFrame) {
                    callback(spriteFrame);
                }
            }
        });

    }

    if (jsb.fileUtils.isFileExist(filepath)) {
        cc.log('showPic isFileExist:' + filepath);
        loadEnd();
        return;
    }
    cc.log('showPic is not FileExist:' + filepath);
},

我把这个去掉:sf.retain();了 还是换不了图,求楼主解答

我把这个去掉:sf.retain();了 还是换不了图,上面有我的代码

解决了。是图片名字一样的问题。把每次保存下来的图片名字改一下就好

以前就为了保留原有文件名才这样的,如果新名字当然没问题了

名字一样的话。你有其他办法可以换图吗。我把sf.retain();去掉了还是不信。显示的还是第一次显示的图

尝试过 新建节点 和 cc.textureCache.removeTexture 两种方法都不行

node.getComponent(cc.Sprite).spriteFrame = new cc.SpriteFrame(cc.url.raw(“你的路径”));

你测过了吗。node.getComponent(cc.Sprite).spriteFrame = new cc.SpriteFrame(cc.url.raw(“你的路径”)); 我这边也是不行诶。