天道酬勤,学无止境

cocos2dx 将图像保存到画廊 android(cocos2dx save image in to gallery android)

问题

我想截屏并将其保存在图库中。 我试过的:

CCSize size = CCDirector::sharedDirector()->getWinSize();

CCRenderTexture* texture = CCRenderTexture::create((int)size.width, (int)size.height, kCCTexture2DPixelFormat_RGBA8888);
texture->setPosition(ccp(size.width/2, size.height/2));
texture->begin();
CCDirector::sharedDirector()->getRunningScene()->visit();
texture->end();
texture->saveToFile("scrshot.png", kCCImageFormatJPEG);

在 iOS 中它运行良好并且能够将图像保存到文档中,但问题出在 android 中:

有两种可能

1) 纹理->saveToFile("scrshot.png", kCCImageFormatJPEG); 或纹理->saveToFile("我的路径"); -> 它编译但图像保存在哪里?

2)使用JNI保存Bitmap文件->问题是如何将CCRenderTexture转换为Bitmap并解析它。

回答1

我很快解决了这个问题,但忘了给出答案,但现在给出,因为它可能对某人有所帮助

我的代码仅适用于 iOS 和 android

代码是

CCSize size = CCDirector::sharedDirector()->getWinSize();

CCRenderTexture* texture = CCRenderTexture::create((int)size.width, (int)size.height, kCCTexture2DPixelFormat_RGBA8888);
texture->setPosition(ccp(size.width/2, size.height/2));
texture->begin();
CCDirector::sharedDirector()->getRunningScene()->visit();
texture->end();

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

    std::string str =  CCFileUtils::sharedFileUtils()->getWritablePath();
    str.append("/imageNameToSave.png");
    const char * c = str.c_str();
    texture->saveToFile(c);
    SaveImageAndroidJNI(true);

#else

        texture->saveToFile("imageNameToSave.png", kCCImageFormatPNG);
        BridgeClass::shared()->saveTOAlbum();

#endif

在我的 BridgeClass 中

void BridgeClass:: saveTOAlbum(){

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *yourArtPath = [documentsDirectory stringByAppendingPathComponent:@"/imageNameToSave.png"];

    UIImage *image = [UIImage imageWithContentsOfFile:yourArtPath];

    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert !" message:@"Photo Saved To Photos." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    [alert show];
}

对于 iOS,它将保存到图库

对于 android 有一个类 androidJNI.cpp

void SaveImageAndroidJNI(bool visible){
        JniMethodInfo t;
        if (JniHelper::getStaticMethodInfo(t, "yourPackageName/ClassName"
                                           ,"SaveImageAndroidJNI"
                                           ,"(Z)V"))
        {
            t.env->CallStaticVoidMethod(t.classID,t.methodID,visible);
        }
    }

以及将图像保存到数据/数据的android本机方法

static void SaveImageAndroidJNI(final boolean visible)
{

    ContextWrapper c = new ContextWrapper(me);
    String path = c.getFilesDir().getPath() + "/imageNameToSave.png";
    System.out.println("Paht to check --"+path);
    File imgFile = new  File(path);

    Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
    ArrayList<Uri> uris = new ArrayList<Uri>();
    uris.add(Uri.parse(path));

    OutputStream output;
 // Find the SD Card path
    File filepath = Environment.getExternalStorageDirectory();

    // Create a new folder in SD Card
    File dir = new File(filepath.getAbsolutePath()
            + "/Your Folder Name/");
    dir.mkdirs();

    // Create a name for the saved image
    File file = new File(dir, "imageNameToSave.png");

    try {

        output = new FileOutputStream(file);

        // Compress into png format image from 0% - 100%
        myBitmap.compress(Bitmap.CompressFormat.PNG, 100, output);
        output.flush();
        output.close();
    }

    catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    Intent intent = new Intent();
    Uri pngUri = Uri.fromFile(file);


    intent.setAction(Intent.ACTION_SEND);
    intent.putExtra(Intent.EXTRA_STREAM, pngUri);
    intent.setType("image/jpeg");

        me.startActivity(Intent.createChooser(intent, "Share Image"));    
}

当从数据/数据访问此图像时,此处无法直接访问将此图像保存到 sd 卡并从 cocos2dx 访问

但对于 android 必须使用 getWritablePath 函数获取可写路径并将此值解析为 saveToFile 函数和SaveImageAdmobJNI(true); 将调用本机方法,在本机方法中,您可以保存获取图像路径并将其保存到图库

注意: getWritablePath() - 这个函数会给你从 data->data->YOUR_PAKAGE 的路径

随时提出疑问。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • cocos2dx save image in to gallery android
    I want to take screenshots and save it in the gallery. What I have tried: CCSize size = CCDirector::sharedDirector()->getWinSize(); CCRenderTexture* texture = CCRenderTexture::create((int)size.width, (int)size.height, kCCTexture2DPixelFormat_RGBA8888); texture->setPosition(ccp(size.width/2, size.height/2)); texture->begin(); CCDirector::sharedDirector()->getRunningScene()->visit(); texture->end(); texture->saveToFile("scrshot.png", kCCImageFormatJPEG); in iOS it is working perfectly and am able to save image in to documents, but the problem is in android : There are two possibilities 1)
  • 将图像保存到android中的画廊(save the image to the gallery in android)
    问题 如何将相机拍摄的图像保存到图库中? 我有这个代码但不保存图像 private File createImageFile() throws IOException { // Create an image file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); File image = File.createTempFile( imageFileName, /* prefix */ ".jpg", /* suffix */ storageDir /* directory */ ); // Save a file: path for use with ACTION_VIEW intents mCurrentPhotoPath = image.getAbsolutePath(); return image; } 几乎用这个 private void galleryAddPic() { Intent
  • 如何在Android Gallery中保存图像(How to save image in android gallery)
    问题 我尝试将图像保存到WathsappIMG中,但是当我转到Android图像画廊时,我看不到图像,并且可以从ES File Explorer中看到该图像到目录中 OutputStream output; // Find the SD Card path File filepath = Environment.getExternalStorageDirectory(); // Create a new folder in SD Card File dir = new File(filepath.getAbsolutePath() + "/WhatSappIMG/"); dir.mkdirs(); // Retrieve the image from the res folder BitmapDrawable drawable = (BitmapDrawable) principal.getDrawable(); Bitmap bitmap1 = drawable.getBitmap(); // Create a name for the saved image File file = new File(dir, "Wallpaper.jpg" ); try { output = new FileOutputStream(file); // Compress into png
  • 将图像保存在画廊 android 中(save image in gallery android)
    问题 我正在使用此代码来保存图像: URL url = null; try { url = new URL("image"); } catch (MalformedURLException e1) { e1.printStackTrace(); } Bitmap bmp = null; try { bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream()); } catch (IOException e1) { e1.printStackTrace(); } OutputStream output; File filepath = Environment.getExternalStorageDirectory(); File dir = new File(filepath.getAbsolutePath() + "/folder name/"); dir.mkdirs(); File file = new File(dir, image + ".png"); Toast.makeText(HomeActivity.this, "Image Saved to SD Card", Toast.LENGTH_SHORT).show(); try { output = new
  • Android:将位图保存到图库 ==> 时间创建错误(Android: Save Bitmap to Gallery ==> Time created wrong)
    问题 在我的 Android 应用程序中,我想在图库中保存一个位图,实际上它适用于下面的代码。 唯一的错误是,当我在图库中打开图像时,详细信息中创建的时间是错误的。 然后,图像在画廊中的顺序不正确。 有人有想法吗? 非常感谢您的帮助 String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); Bitmap combination = //get my bitmap! //save in gallery MediaStore.Images.Media.insertImage(exploreActivity.getContentResolver(),combination,"test_"+ timeStamp + ".jpg",timeStamp.toString()); 这是详细信息的打印屏幕: 回答1 插入图像时需要定义 DATE_TAKEN。 这可以通过更改将图像添加到图库的方式并执行以下操作来完成: public static Uri addImageToGallery(Context context, String filepath, String title, String description) { ContentValues values = new
  • 如何从android画廊隐藏图像(how to hide images from android gallery)
    问题 我当前项目的一部分是从URL下载图像,然后保存到SDCard。 但是问题是sdcard中所有保存的图像都显示在android gallery页面中。 我想要的是“我不希望所有已保存的图像都在android画廊中。 ” 回答1 添加“ .nomedia”文件。 不工作? 尝试第二个选项。 将文件保存到以“。”开头的文件夹,例如/sdcard/.myimages/ 回答2 您可以使用以下代码创建.nomedia文件: String NOMEDIA=".nomedia"; File Folder = new File(Environment.getExternalStorageDirectory() + "/mydir"); if(Folder.mkdir()) { nomediaFile = new File(Environment.getExternalStorageDirectory() + "/mydir/"+ NOMEDIA); if(!nomediaFile.exists()){ nomediaFile.createNewFile(); } } 回答3 我找到了一种简单的方法(我认为是这样)。 在“ Android”文件夹(其中存在data和obb文件夹)中创建一个文件夹,然后将媒体(图片,视频等)放入您创建的文件夹中。 Gallery应用程序会忽略该“ Android
  • 保存到sdcard的图像未出现在Android的Gallery应用中(Image, saved to sdcard, doesn't appear in Android's Gallery app)
    问题 我将图像保存到sdcard中,直到我拔下sdcard并将其返回之前,它才出现在Gallery应用程序中。 你知道为什么会这样吗? 似乎Gallery应用程序具有一些在文件保存时未更新的缓存... 其实,我也想在Gallery应用程序中打开刚刚保存的图像,但没有成功这是我关于这个问题的问题。 回答1 安装SD卡后,系统会扫描SD卡以查找任何新的映像(和其他)文件。 如果要以编程方式添加文件,则可以使用此类: http://developer.android.com/reference/android/media/MediaScannerConnection.html 回答2 一个更简单的解决方案是使用静态便捷方法scanFile(): File imageFile = ... MediaScannerConnection.scanFile(this, new String[] { imageFile.getPath() }, new String[] { "image/jpeg" }, null); 如果this是您的活动(或任何上下文),则只有在您使用非标准文件扩展名且null为可选回调(对于这种简单情况我们不需要)的情况下,mime类型才是必需的。 回答3 我对原始问题以及可能存在此问题的其他人的回答: 我遇到了同样的问题
  • Cocos2dx Android 启动后我坏掉的现象是onResume Activity 的图像精灵(Cocos2dx Android I'm broken phenomenon after the launch is an image sprite onResume Activity)
    问题 CCTexture2D *t = new CCTexture2D(); t->initWithData(imageData, kCCTexture2DPixelFormat_RGBA8888, sprite->getTexture()->getPixelsWide(), sprite->getTexture()->getPixelsHigh(), sprite->getTexture()->getContentSize()); CCSprite *ret = CCSprite::createWithTexture(t); 这样,只创建了标题和类似精灵的现象。 CCSprite *ret 对海滩上的水的效果精灵自定义图像。 IOS,Android,没有任何问题,onPause()->onResume(a)通过Ret图像变黑 如何解决? 回答1 任何未从文件加载的精灵在恢复后都会变黑,无论是用数据初始化的 CCTexture2D 还是 CCRenderTexture。 最简单的解决方案:停止使用动态纹理,从文件加载所有纹理。 解决方法:恢复放置在 cocos2d::CCApplication 子类中的事件回调 - 它是 applicationWillEnterForeground() 方法。 您可以在此方法中手动重新加载所有纹理。 例如,创建自己的接口 A
  • 如何将位图保存到android画廊(how to save bitmap to android gallery)
    问题 不幸的是,我发现的解决方案不适用于android 5.1.1。 我有一个称为源的位图。 我需要将其直接保存到手机的图库中。 我的清单包含<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />您可以给我一个可行的方法来做到这一点吗? 回答1 在API 29(Android Q)之前有几种不同的执行方法,但所有方法都涉及一个或几个Q不推荐使用的API。在2019年,这是一种向后兼容和向前兼容的方法: (由于现在是2019年,所以我将用Kotlin编写) /// @param folderName can be your app's name private fun saveImage(bitmap: Bitmap, context: Context, folderName: String) { if (android.os.Build.VERSION.SDK_INT >= 29) { val values = contentValues() values.put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/" + folderName) values.put(MediaStore.Images.Media.IS_PENDING
  • 如何在Android Gallery中创建应用程序特定的文件夹?(How to create application specific folder in android gallery?)
    问题 我正在构建android应用程序“ XYZ ”,用户将在其中存储图像和视频等媒体。 因此,我想在android画廊中创建一个名为“ XYZ”的文件夹,并将特定于该应用程序的所有媒体存储在“ XYZ”中。 我该如何实现? 目前,我可以将媒体存储在sdcard上,并且可以在扫描媒体文件时将它们显示在android gallery的“ images”文件夹中。 回答1 我想存储画廊可访问的图像的正确方法是将文件写入此目录。 static final String appDirectoryName = "XYZ"; static final File imageRoot = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), appDirectoryName); 对于视频 static final File videoRoot = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_MOVIES), appDirectoryName); 并创建图像 imageRoot.mkdirs(); final File image = new File
  • 启动 Intent.ACTION_VIEW 意图不适用于保存的图像文件(Launching Intent.ACTION_VIEW intent not working on saved image file)
    问题 首先让我说这个问题与我的另一个问题略有联系。 实际上它是为此而创建的。 我有以下代码将从网上下载的位图写入sd卡中的文件: // Get image from url URL u = new URL(url); HttpGet httpRequest = new HttpGet(u.toURI()); HttpClient httpclient = new DefaultHttpClient(); HttpResponse response = (HttpResponse) httpclient.execute(httpRequest); HttpEntity entity = response.getEntity(); BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity); InputStream instream = bufHttpEntity.getContent(); Bitmap bmImg = BitmapFactory.decodeStream(instream); instream.close(); // Write image to a file in sd card File posterFile = new File(Environment
  • 当从它的孩子那里请求无效时,画廊上的奇怪动画(Weird animation on Gallery when a invalidate is requested from it's children)
    问题 这是我的画廊的适配器,我在上面显示 ImageViews(页面的拇指) 我想以异步方式加载图像(有时这可能来自网络),所以我做了以下代码: public View getView(int position, View convertView, ViewGroup parent) { final ImageView image = convertView != null ? convertView : new ImageView(getContext()); final PageInfo page = getItem(position); image.setBackgroundColor(Color.WHITE); image.setLayoutParams(new Gallery.LayoutParams(96, 170)); new AsyncTask<Void, Void, Bitmap>() { @Override protected Bitmap doInBackground(Void... arg0) { try { File thumbnail = page.thumbnail();//Thumbnail download the image if not available return BitmapFactory.decodeStream(new
  • 图像从 SD 卡到画廊视图(Image From sd card to galleryview)
    问题 在我的应用程序中,我想将图像从 SD 卡获取到特定位置,并且需要在图库中显示, 我使用的代码正在附加 private Gallery gallery; private ImageView imgView; int position; private byte[] data = { }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.gridview); try{ String filepath = "/sdcard/data/Crak/"; File imagefile = new File(filepath +"abcd.jpg" ); FileInputStream fis = new FileInputStream(imagefile); Bitmap bi = BitmapFactory.decodeStream(fis); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bi.compress(Bitmap.CompressFormat.JPEG, 100, baos); data = baos
  • 来自自定义相机的 Android 新拍摄的照片不会出现在画廊(媒体商店)中(Android Newly Taken Photo from custom camera does not appear in gallery (media store))
    问题 在我的应用程序中,我最初从图库加载所有图像,即 (MediaStore.Images.Media.EXTERNAL_CONTENT_URI) 用户可以通过我的应用程序拍照,但我有一个自定义相机,即我不使用默认手机相机拍照,我有自己的表面视图,我直接处理 Camera 对象,并处理相机图片。 我将此图像保存在自定义文件夹中。 一旦用户返回我的应用程序,我希望新拍摄的照片出现在我的图库中 问题:新拍的图片没有出现在我用MediaStore.Images.Media.EXTERNAL_CONTENT_URI加载的光标中 只有当我重新安装应用程序并强制重新扫描时,问题才会消失。 我该如何解决? 我想让每张立即拍摄的照片都出现在我的光标中吗? 我已经做了一些研究,但不要用下面的 startactivity 解决方案告诉我内容值 startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 这不起作用,因为同样,我有自己的相机,我没有使用手机的默认相机活动 我也试过 getContentResolver().notifyChange(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null); 这也不起作用 有人可以帮忙吗? 谢谢 回答1 您只需要发送一个广播
  • 捕获的图像未显示在图库中,但已成功存储在 sdcard 中(Captured image was not showing in gallery but it stored successfully in sdcard)
    问题 我是 android 开发的新手,我正在做一个小应用程序来使用UVCCamera捕获 USB Camrea 图像。 我已经使用UVCCamera捕获图像并像这样存储在 sdcard 中 File filepath = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "IMG_"+getDateTime() + ".jpg"); mCameraClient.captureStill(filepath.toString()); 这里 mCameraClient 将与 UVC Camera 进行交互并捕获图像并存储在该路径中,它将回调 onCaptureDone 方法 @Override public void onCaptureDone(final String path) { // TODO Auto-generated method stub Log.e(TAG, "onCaptureDone called"); getActivity().runOnUiThread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub //Toast --
  • 如何在Android上通过Cocos2d-x获取屏幕截图保存的路径(How to get screenshot saved path by Cocos2d-x on android)
    问题 我使用 saveToFile 方法保存屏幕截图,并检查 CCLOG,它显示 /data/data/com.xxx.xxx/files/xxx.png 但是,当我使用 Java 获取此文件时,它显示“没有此类文件或目录”.... 我该怎么办? 回答1 我有同样的问题。 显然,cocos2dx 从不创建可写路径目录,因此不会保存屏幕截图。 我的解决方案是,而不是调用CCRenderTexture::saveToFile ,复制其实现并手动将文件保存到不同的路径: std::string MyClass::takeScreenshot(CCScene* scene) { cocos2d::CCSize screenSize = cocos2d::CCDirector::sharedDirector()->getWinSize(); cocos2d::CCRenderTexture* tex = cocos2d::CCRenderTexture::create(screenSize.width, screenSize.height); tex->setPosition(ccp(screenSize.width/2, screenSize.height/2)); //use a different dir than cocos default writable path std
  • 图片来自相机还是画廊?(Picture coming from camera or gallery?)
    问题 我有一个意图选择器,使我可以像这样从图库或照相机中选择图像: Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT,null); galleryIntent.setType("image/*"); galleryIntent.addCategory(Intent.CATEGORY_OPENABLE); Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); Intent chooser = new Intent(Intent.ACTION_CHOOSER); chooser.putExtra(Intent.EXTRA_INTENT, galleryIntent); chooser.putExtra(Intent.EXTRA_TITLE, "title"); Intent[] intentArray = {cameraIntent}; chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray); startActivityForResult(chooser,REQUEST_CODE); 我希望我的onActivityResult方法像这样:
  • 无法在 OSX 上使用 Eclipse for android 链接到 cocos2dx(Can't link to cocos2dx using eclipse for android on OSX)
    问题 我以前从未在开发环境的初始设置上花费这么多时间,这有点荒谬。 我正在尝试运行 cocos2dx 附带的演示代码。 我正在使用: ADK 附带的 eclipse 风味。 cocos2d-2.1beta3-x-2.1.0 ndk-r8c 我尝试使用 create-android-project.sh 构建应用程序模板,但我遇到了同样的问题,但对于这个问题,我将参考 hello.cpp 示例应用程序。 我运行 build_native.sh 脚本,然后在 eclipse 中导入它。 接下来是我尝试过的所有不同教程的不同之处。 有人说要“转换为 C++ 项目”,有人说此时您已经可以“作为 android 项目运行”了。 对我来说,android java 项目似乎无法链接到 cocos2dx 项目。 我得到: The import org.cocos2dx.lib cannot be resolved 为了 import org.cocos2dx.lib.Cocos2dxActivity 没有教程真正提到必须构建 cocos2dx 库,除了一个说您现在必须将 cocos 库作为项目导入到 eclipse 工作区。 所以我已经这样做了并构建了它们,但是构建后它们存在一些错误。 我还尝试在项目中添加要链接的文件夹路径,对我来说,它位于 /cocos2d-2.1beta3-x-2.1.0
  • 文件未添加到Android画廊(File not added to gallery android)
    问题 我正在制作的这个应用程序正在拍照并将其保存到sdcard,但是图像未在图库中显示...我的代码有问题吗? public void takepicture(View view){ try{ String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { //To store public files File directory=new File(Environment.getExternalStorageDirectory() , "Myapp Pictures"); if(!directory.exists()) directory.mkdir(); // Create an image file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "Img" + timeStamp + ".jpg"; file=new File(directory, imageFileName); if(!file.exists()) file.createNewFile(); }
  • 如何在Android的画廊视图中显示来自网络的图像(How to display images from web in gallery view in android)
    问题 我使用可绘制文件夹中的图像将图像显示到图库视图中。 我的代码 public class GalleryView extends Activity { Integer[] pics = { R.drawable.antartica1, R.drawable.antartica2, R.drawable.antartica3, R.drawable.antartica4, R.drawable.antartica5, R.drawable.antartica6, R.drawable.antartica7, R.drawable.antartica8, R.drawable.antartica9, R.drawable.antartica10 }; ImageView imageView; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Gallery ga = (Gallery)findViewById(R.id.Gallery01); ga.setAdapter(new ImageAdapter(this)); imageView = (ImageView)findViewById(R.id