Titanium Alloy:将视图作为图像保存到照片库?

Titanium Alloy: Saving a View as image to the photoGallery?

所以我目前有一个 window 和一个视图 (id="newPhoto"),我在其中放置了上一步的图像。在这个新的照片视图上,我通过 css 放置了一个新视图 (id="content"),上面有一个图标和一些文本。 然后我想将带有图像、图标和文本的父视图作为新图像保存到 photoGallery。最简单的方法是什么?将所有内容放在一个视图中并保存新视图,还是将所需部分截图并保存? 无法使其正常工作:(

我的filterWindow.xml文件:

<Alloy>
    <Window id="filterWindow">

       <View id="finalImage" /> 
            <View id="selectedPhoto" />
            <View id="counter">
                <ImageView id="weatherIcon" />
                <Label id="label" />
            </View>

        <Button id="filterAndSaveBtn" onClick="filterAndSave">Filter</Button>

    </Window>
</Alloy>

我的filterWindow.js:

var photo = Alloy.createController('photo').getView();

$.selectedPhoto.add(photo);
$.selectedPhoto.width = appWidth;
$.selectedPhoto.height = appWidth;

$.label.text = "Some text";

function filterAndSave(e) {
    var blob = $.finalImage.toBlob();
    Ti.Media.saveToPhotoGallery(blob,{
        success: function(e){
            alert('Saved image to gallery');
        },
        error: function(e){
            alert("Error trying to save the image.");
        }
    });
}

在此先感谢您看一看!

我在我的一个项目中遇到了类似的问题。我把我需要的区域截图了作为新图。

//This should be put in your filterAndSave method
if (Ti.Platform.osname == "android") {
    var image = $.imageContainer.toImage().media;
} else {
    var image = $.imageContainer.toImage(null, true);
}

//Saving the image if it is needed somewhere else
var f = Titanium.Filesystem.getFile(Titanium.Filesystem.applicationDataDirectory, "finalChallengeImage.jpeg");
f.write(image);
//Save it to the gallery and do what has to be done

你应该看看toImage()函数的official documentation。它需要不同的参数,具体取决于您使用的平台。

请注意,我不需要将图像保存到图库中,因此必须另外完成(尽管您似乎已经知道如何执行此操作)。

好的...找到了。需要将其另存为 png 文件,否则它会将重叠元素的背景设置为白色,尽管它的高度较小。但无论如何...另存为 png 有效。但只在 iOS.

中尝试过

所以这是最终的工作代码:

filterWindow.xml:

<View id="finalImage">
    <View id="selectedPhoto" />
    <View id="counter">
        <ImageView id="weatherIcon" />
        <Label id="label" />
    </View>
</View>

filterWindow.js:

var photo = Alloy.createController('photo').getView();

// adding the selected photo from the previous step into the first child-View
$.selectedPhoto.add(photo);

$.selectedPhoto.width = appWidth;
$.selectedPhoto.height = appWidth;

$.finalImage.width = appWidth;
$.finalImage.height = appWidth; 

$.label.text = "Some text";

function filterAndSave(e) {
    if (Ti.Platform.osname == "android") {
        var image = $.finalImage.toImage().media;
    } else {
        var image = $.finalImage.toImage(null, true);
    }

    //Saving the image if it is needed somewhere else
    var f = Titanium.Filesystem.getFile(Titanium.Filesystem.applicationDataDirectory, "finalImage.png");
    f.write(image);

    //Save it to the gallery
    Ti.Media.saveToPhotoGallery(image,{
        success: function(e){
            alert('Saved image to gallery');
        },
        error: function(e){
            alert("Error trying to save the image.");
        }
    });
}

再次感谢罗宾。