【问题标题】:Saving a byte array as jpg file in android device folder在android设备文件夹中将字节数组保存为jpg文件
【发布时间】: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,这可能会造成混乱,再次感谢

标签: android xamarin xamarin.android


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 2012-10-24
      • 2021-05-25
      • 1970-01-01
      相关资源
      最近更新 更多