为了账号安全,请及时绑定邮箱和手机立即绑定

在画布上绘制固定大小的位图图像

在画布上绘制固定大小的位图图像

C#
胡说叔叔 2021-07-01 13:00:02
我正在创建一个纸牌游戏,为此我创建了一个自定义表面视图,其中图像正在加载。由于图像是从互联网上下载的,因此它们的大小不同,在屏幕上看起来很糟糕。我想在这里实现两件事。加载固定大小的图像或动态调整图像大小。从屏幕底部向上绘制图像。对于第一点,我使用了 CreateBitmap 方法,但低于异常。java.lang.OutOfMemoryError: Failed to allocate a 1915060280 byte allocation with 4194304 free bytes and 123MB until OOM error为了解决这个问题,我想根据这个问题和这个使用 Glide/Picasso ,但我发现 Glide/Picasso 只在 imageview 上加载图像,但我没有任何 imageview,我只有一个线性布局内的自定义表面视图.对于第二点,我使用了图像的旋转。以下是它的代码。  public  void Render(Canvas paramCanvas)    {        try        {            // paramCanvas.DrawColor(Android.Graphics.Color.Blue);            int i = 0;            Down_Card_Gap = 0;            foreach (Cards localcard in FaceDownDeck.ToList())            {                Bitmap localimage = BitmapFactory.DecodeResource(Resources, localcard.GetImageId(context));                  Bitmap rotatedimage = RotateBitmap(localimage, 180);                paramCanvas.DrawBitmap(rotatedimage, (Screen_Center_X - Card_Width / 2)+Down_Card_Gap, (Screen_Height - Card_Height), null);               //   paramCanvas.DrawBitmap(localimage, (Screen_Center_X - Card_Width / 2), (Screen_Center_Y - Card_Height), null);                if (i++ == 7)                { break; }                if (Down_Card_Gap > 0)                {                    Down_Card_Gap += Card_Width / 2;                 }                else                {                    Down_Card_Gap -= Card_Width / 2;                }                Down_Card_Gap *= -1;            }        }        catch (Exception ex)        {            System.Diagnostics.Debug.WriteLine(ex.ToString());        }    }    private Bitmap RotateBitmap(Bitmap localimage, float angle)    {         Matrix matrix = new Matrix();        matrix.PostRotate(angle);        matrix.PostScale(Card_Width, Card_Height);        Bitmap resized= Bitmap.CreateBitmap(localimage, 0, 0, localimage.Width, localimage.Height, matrix, true);        localimage.Recycle();        return resized;    }我想知道这是否是一种正确的方法,或者是否有更好的方法来实现该功能。
查看完整描述

1 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

加载固定大小的图像或动态调整图像大小。


关于fixed size和resize,可以参考这个,finddecodeFile方法:


   protected Bitmap decodeFile(File f) {

        try { 

            //decode image size 

            BitmapFactory.Options o = new BitmapFactory.Options();

            o.inJustDecodeBounds = true;

            BitmapFactory.decodeStream(new FileInputStream(f), null, o);


            //Find the correct scale value. It should be the power of 2. 

            final int REQUIRED_SIZE = 150;

            int width_tmp = o.outWidth, height_tmp = o.outHeight;

            int scale = 1;

            while (true) { 

                if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE)

                    break; 

                width_tmp /= 2;

                height_tmp /= 2;

                scale *= 2;

            } 


            //decode with inSampleSize 

            BitmapFactory.Options o2 = new BitmapFactory.Options();

            o2.inSampleSize = scale;

            return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);

        } catch (FileNotFoundException e) {

        } 

        return null; 

    } 

可以看到,它用于 BitmapFactory.Options.inJustDecodeBounds= true预加载位图,并缩放位图。也可以参考官方文档。阅读本文以压缩位图的质量。



查看完整回答
反对 回复 2021-07-18
  • 1 回答
  • 0 关注
  • 232 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信