C# 更改保存视图的宽度和高度

C# 更改保存视图的宽度和高度,c#,android,xamarin,xamarin.android,C#,Android,Xamarin,Xamarin.android,我有将布局保存为位图的代码 给你 public static class App { public static Java.IO.File _file; public static Java.IO.File _dir; public static Bitmap bitmap; } [Activity(Label = "SaveViewAsBitMap", ScreenOrientation = ScreenOrientation.Landscape, Theme = "

我有将布局保存为位图的代码

给你

public static class App
{
    public static Java.IO.File _file;
    public static Java.IO.File _dir;
    public static Bitmap bitmap;
}
[Activity(Label = "SaveViewAsBitMap",  ScreenOrientation = ScreenOrientation.Landscape, Theme = "@android:style/Theme.Black.NoTitleBar")]
public class Badge : Activity
{
    public static string name_from_activity;
    public static string surname_from_activity;
    public string inn_from_activity;
    private ImageView _imageView;
    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);

        // Make it available in the gallery
        Intent mediaScanIntent = new Intent(Intent.ActionMediaScannerScanFile);
        Uri contentUri = Uri.FromFile(App._file);
        mediaScanIntent.SetData(contentUri);
        SendBroadcast(mediaScanIntent);

        // Display in ImageView. We will resize the bitmap to fit the display
        // Loading the full sized image will consume to much memory 
        // and cause the application to crash.

        int height = Resources.DisplayMetrics.HeightPixels;
        int width = _imageView.Height;
        App.bitmap = App._file.Path.LoadAndResizeBitmap(width, height);
        if (App.bitmap != null)
        {
            _imageView.SetImageBitmap(App.bitmap);
            App.bitmap = null;
        }

        // Dispose of the Java side bitmap.
        GC.Collect();
    }

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        // Set our view from the "main" layout resource
        SetContentView (Resource.Layout.Main);
        TextView bt1 = FindViewById<TextView>(Resource.Id.Surname);
        bt1.Click += Bt1_Click;
        name_from_activity = Intent.GetStringExtra("Name");
        surname_from_activity = Intent.GetStringExtra("Surname");
        inn_from_activity = Intent.GetStringExtra("INN");
        TextView Name = FindViewById<TextView>(Resource.Id.Name);
        Name.Text = name_from_activity;
        TextView Surname = FindViewById<TextView>(Resource.Id.Surname);
        Surname.Text = surname_from_activity;
        string path = "Fonts/proximanovaregular.otf";
        Typeface tf = Typeface.CreateFromAsset(Assets, path); //Custom fonts for TextBoxes 
        Name.Typeface = tf;
        Surname.Typeface = tf;
        var barcodeWriter = new ZXing.Mobile.BarcodeWriter //Creating qr code using Intent data
        {
            Format = ZXing.BarcodeFormat.QR_CODE,
            Options = new ZXing.Common.EncodingOptions  //Options for QR code dimensions
            {
                Width = 600,
                Height = 600
            }
        };
        ImageView qr = FindViewById<ImageView>(Resource.Id.qr);
        var bitmap = barcodeWriter.Write(inn_from_activity);
        qr.SetImageBitmap(bitmap);
        if (IsThereAnAppToTakePictures())
        {
            CreateDirectoryForPictures();
            _imageView = FindViewById<ImageView>(Resource.Id.photo);
            TakeAPicture();
        }
    }

    //Button handler for bitmap
    private void Bt1_Click(object sender, System.EventArgs e)
    {
        View v = FindViewById<LinearLayout>(Resource.Id.badge2);
        Bitmap myBitMap = createViewBitmap(v);
        Drawable drawable = new BitmapDrawable(myBitMap);
        //img.SetBackgroundDrawable(drawable);
       // MediaStore.Images.Media.InsertImage(ContentResolver, myBitMap, "title", "description");
        saveImage(myBitMap);
        Intent mediaScanIntent2 = new Intent(Intent.ActionMediaScannerScanFile);
        Java.IO.File myFile = new Java.IO.File(Android.OS.Environment.ExternalStorageDirectory + "/DCIM/Camera", name_from_activity.ToString() + surname_from_activity.ToString() + ".jpg");
       Android.Net.Uri contentUri = Android.Net.Uri.FromFile(myFile);
       mediaScanIntent2.SetData(contentUri);
       SendBroadcast(mediaScanIntent2);
    }

    //Creating bitmap from view via Canvas
    public Bitmap createViewBitmap(View v)
    {
        Bitmap bitmap = Bitmap.CreateBitmap(v.Width, v.Height,
                Bitmap.Config.Argb8888);
        Canvas canvas = new Canvas(bitmap);
        v.Draw(canvas);
        return bitmap;
    }

    //Check if directory exists, if no, create it
      private void CreateDirectoryForPictures()
      {
          App._dir = new Java.IO.File(
              Environment.GetExternalStoragePublicDirectory(
                  Environment.DirectoryPictures), "CameraAppDemo");
          if (!App._dir.Exists())
          {
              App._dir.Mkdirs();
          }
      }

     //Returning avialable activities
     private bool IsThereAnAppToTakePictures()
     {
         Intent intent = new Intent(MediaStore.ActionImageCapture);
         IList<ResolveInfo> availableActivities =
             PackageManager.QueryIntentActivities(intent, PackageInfoFlags.MatchDefaultOnly);
         return availableActivities != null && availableActivities.Count > 0;
     }

    //Method for opening default Camera  Activity and making photo
    private void TakeAPicture()
    {
        Intent intent = new Intent(MediaStore.ActionImageCapture);

        App._file = new Java.IO.File(App._dir, String.Format("myPhoto_{0}.jpg", Guid.NewGuid()));

        intent.PutExtra(MediaStore.ExtraOutput, Uri.FromFile(App._file));

        StartActivityForResult(intent, 0);
    }


    //Method for saving image to device 
    public static void saveImage(Bitmap bmp)
    {
         try
        {

            using (var os = new System.IO.FileStream(Android.OS.Environment.ExternalStorageDirectory + "/DCIM/Camera/" + name_from_activity.ToString()+surname_from_activity.ToString() + ".jpg", System.IO.FileMode.CreateNew))
            {
                bmp.Compress(Bitmap.CompressFormat.Jpeg, 95, os);
            }
        }
        catch (Exception e)
        {

        }

    }

}
但它不起作用,它只保存了部分布局

我需要如何编写代码


感谢您的帮助。

我已经为我正在使用的另一个项目构建了一个原型


此代码
Bitmap.CreateBitmap(370204,Bitmap.Config.argb888)将剪切宽度为370、高度为204的源位图。位图无法缩放。因为您仍在使用视图绘制位图

获取视图位图时,需要缩放位图:

    public static Bitmap zoomImg(Bitmap bm, int newWidth, int newHeight)
    {
         int width = bm.Width;
         int height = bm.Height; 
         float scaleWidth = ((float)newWidth) / width;
         float scaleHeight = ((float)newHeight) / height;
         Matrix matrix = new Matrix();
         matrix.PostScale(scaleWidth, scaleHeight);
         Bitmap newbm = Bitmap.CreateBitmap(bm, 0, 0, width, height, matrix, true);
         return newbm;
    }

    public Bitmap createViewBitmap2(View v)
    {
        Bitmap bitmap = Bitmap.CreateBitmap(v.Width, v.Height,Bitmap.Config.Argb8888);
        Canvas canvas = new Canvas(bitmap);
        v.Draw(canvas);
        return zoomImg(bitmap, 370, 204);
    }

这是ASP.NET,我正在使用xamarin
    public static Bitmap zoomImg(Bitmap bm, int newWidth, int newHeight)
    {
         int width = bm.Width;
         int height = bm.Height; 
         float scaleWidth = ((float)newWidth) / width;
         float scaleHeight = ((float)newHeight) / height;
         Matrix matrix = new Matrix();
         matrix.PostScale(scaleWidth, scaleHeight);
         Bitmap newbm = Bitmap.CreateBitmap(bm, 0, 0, width, height, matrix, true);
         return newbm;
    }

    public Bitmap createViewBitmap2(View v)
    {
        Bitmap bitmap = Bitmap.CreateBitmap(v.Width, v.Height,Bitmap.Config.Argb8888);
        Canvas canvas = new Canvas(bitmap);
        v.Draw(canvas);
        return zoomImg(bitmap, 370, 204);
    }