在android设备文件夹中将字节数组保存为jpg文件

Posted

技术标签:

【中文标题】在android设备文件夹中将字节数组保存为jpg文件【英文标题】:Saving a byte array as jpg file in android device folder 【发布时间】:2018-02-16 14:33:05 【问题描述】:

我正在尝试将图像保存在 android 设备的文件夹中。我使用的代码如下

var newFolder = AndroidEnvironment.GetExternalStoragePublicDirectory(AndroidEnvironment.DirectoryPictures).AbsolutePath + "/NewFolder";

Directory.CreateDirectory(cameraFolder);

byte[] reducedImage = ResizeImageAndroid(imageData, 50, 50, 70);

Image image = new Image Source = ImageSource.FromStream(() => new MemoryStream(reducedImage));

我想将缩小后的图像保存为“newFolder”中的 jpg 文件。我不确定我的方向是否正确,如果我将 reducedImageimage 保存为 newFolder 中的 jpg 文件会很棒。我正在使用 Xamarin,此代码在 Android 项目中。

我已经查看了this 的帖子,但我不明白那里发生了什么。

【问题讨论】:

写入字节数组只需使用 File.WriteAllBytes(path); 谢谢 Jason,我知道但我想保存一张图片 (jpg) 在您的示例中,reduceImage 是一个字节[] 是的,你是对的,Jason,这可能会造成混乱,再次感谢 【参考方案1】:

使用Directory.CreateDirectory 在公共Picture 目录中创建您的文件夹,并使用FileOutputStream 将您的字节[] 写入文件。

示例:

byte[] reducedImage = `some jpeg-based byte array`

var filename = System.IO.Path.Combine(Environment.GetExternalStoragePublicDirectory(Environment.DirectoryPictures).ToString(), "NewFolder");
Directory.CreateDirectory(filename);
filename = System.IO.Path.Combine(filename, "filename.jpg");
using (var fileOutputStream = new FileOutputStream(filename))

    await fileOutputStream.WriteAsync(reducedImage);

【讨论】:

【参考方案2】:

我只想分享我的解决方案,我在研究后发现并且效果很好。

 var btnSave = FindViewById<Button>(Resource.Id.btnSave);
            btnSave.Click += async delegate
                
                    if (signature.IsBlank)
                    
                        // display the base line for the user to sign on.
                        Android.Support.V7.App.AlertDialog.Builder alert = new Android.Support.V7.App.AlertDialog.Builder(this);
                        alert.SetMessage(Resources.GetString(Resource.String.signature_isempty));
                        alert.SetNeutralButton("OK", delegate  );
                        alert.Create().Show();
                    
                    else
                    
                        points = signature.Points;
                        try
                        

                            string nString = String.Format("mySign_0.png", Guid.NewGuid());
                            string absolutePath = String.Format("0/1", Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryPictures).ToString(), GetString(Resource.String.app_name).ToString());
                            var filePath = System.IO.Path.Combine(absolutePath, nString);

                            /**

                             You can get base64 and save your database
                            **/
                            /*var img = await signature.GetImageStreamAsync(SignatureImageFormat.Jpeg);
                            var signatureMemoryStream = (MemoryStream)img;
                            byte[] data = signatureMemoryStream.ToArray();
                            string base64img = Convert.ToBase64String(data);
                            Log.Info(NativeConfig.TAG_DROID, base64img.ToString());

                            File.WriteAllBytes(filePath, data);*/

                            var img = await signature.GetImageStreamAsync(SignatureImageFormat.Png, Color.Black, Color.White, true);
                            var ms = (MemoryStream)img;
                            using (FileStream file = new FileStream(filePath, FileMode.Create, System.IO.FileAccess.Write))
                            
                                byte[] bytes = new byte[ms.Length];
                                ms.Read(bytes, 0, (int)ms.Length);
                                file.Write(bytes, 0, bytes.Length);
                                ms.Close();
                            

                        
                        catch (Exception e)
                        
                            Log.Info(NativeConfig.TAG_DROID, e.Message);
                            Toast.MakeText(this, "No se pudo guardar", ToastLength.Short).Show();
                        
                    
                ;
            btnSave.Dispose();

我修改了示例页面中的代码并添加了filestream。

【讨论】:

以上是关于在android设备文件夹中将字节数组保存为jpg文件的主要内容,如果未能解决你的问题,请参考以下文章

图像捕获,保存文件... Android / Parse

有没有办法在android studio中将音频文件转换为字节数组

在swift 3中将字节数组转换为PDF

Android/Java:将字节数组保存到文件 (.jpeg)

当字节数组的源是 jpg 时,从存储的字节数组创建位图并保存到磁盘会引发 GDI+ 异常

在 C# 中将 Base64 字节数组解码为图像