【问题标题】:convert a cardview to bitmap将卡片视图转换为位图
【发布时间】:2018-02-22 19:08:54
【问题描述】:

类似的问题已经被问过好几次了,但我仍然很难理解图像的保存位置。我正在使用this SO question 的公认解决方案。

我有一个cardview,我想将其转换为图像并分享(这是一个不同的问题)。 我的卡片视图是:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
......
android.support.v7.widget.CardView
        android:id="@+id/cv_abtme"
        android:layout_width="368sp"
        android:layout_height="273dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="101dp"
        android:background="@color/colorPrimaryLight"
        app:cardBackgroundColor="@color/about_instagram_color"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">


        <ImageView
            android:id="@+id/imageView4"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:scaleType="centerCrop"
            app:srcCompat="@mipmap/ic_launcher" />
        ....

    </android.support.v7.widget.CardView>

我正在尝试将其转换为:

public class AboutMeActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_about_me);
        ImageButton cvbutton= findViewById(R.id.imageButton_abtme);


        cvbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getBitmapFromView(view);
                Snackbar.make(getCurrentFocus(),"Image Captured", Snackbar.LENGTH_LONG).show();
            }
        });
    }
    public static Bitmap getBitmapFromView(View view) {
        Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(returnedBitmap);
        Drawable bgDrawable =view.getBackground();
        if (bgDrawable!=null)
            bgDrawable.draw(canvas);
        else
            canvas.drawColor(Color.WHITE);
        view.draw(canvas);
        return returnedBitmap;
    }
}

但我不知道它是如何工作的,因为我看不到任何生成的图像,但显然没有错误。

所以,问题是:

  1. 图像创建的路径是什么?
  2. 我是否需要一些权限才能保存和访问 jpg?

【问题讨论】:

    标签: android bitmap


    【解决方案1】:

    图片创建的路径是什么?

    根据您问题中的代码,它没有保存在任何地方。您没有编写任何代码来保存它。你创建了一个Bitmap 对象,就是这样。

    要将Bitmap 保存为磁盘上的图像文件,请调用compress(),指定图像类型和FileOutputStream 到您要保存的位置。

    【讨论】:

    • 啊..我是这么认为的。但是保存位图有什么用呢?还是可以看到的吗?
    • @BaRud:“那么保存位图有什么用呢?” ——我不明白你的意思,对不起。 “反正还能看到吗?” -- 嗯,你可以在ImageView 中显示Bitmap,如果这就是你的意思。 Bitmap 只是位图的内存表示,就像String 是文本的内存表示一样。
    • 换一种方式,我可以直接使用easyshare分享CardView吗?
    • @BaRud:对不起,我不知道“easyshare”是什么。
    • 我的意思是:developer.android.com/training/sharing/shareaction.html 无论如何谢谢。
    【解决方案2】:

    这是我的代码工作正常。我希望这个代码可能会有所帮助

    这里xml 字段为cardView

    <android.support.v7.widget.CardView 
         xmlns:card_view="http://schemas.android.com/apk/res-auto"
         xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@+id/card_view"
         android:layout_gravity="center"
         android:layout_width="250dp"
         android:layout_height="250dp"
         card_view:cardCornerRadius="4dp">
    
        <ImageView
            android:src="@drawable/img_"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
    </android.support.v7.widget.CardView>
    

    此处代码将cardview下载为jpeg文件

    找到卡片视图 CardView cardView = (CardView) findViewById(R.id.card_view); 加载视图(卡片视图);

    加载视图

     public void loadView(CardView cardView){
    
        try {
            cardView.setDrawingCacheEnabled(true);
            Bitmap bitmap =  loadBitmapFromView(cardView);
            cardView.setDrawingCacheEnabled(false);
    
            String mPath =
                    Environment.getExternalStorageDirectory().toString() + "/sid.jpg";
    
            File imageFile = new File(mPath);
            FileOutputStream outputStream = new
                    FileOutputStream(imageFile);
            int quality = 100;
            bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream);
            outputStream.flush();
            outputStream.close();
    
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }
    

    从视图中获取位图

     public Bitmap loadBitmapFromView(View v) {
        DisplayMetrics dm = getResources().getDisplayMetrics();
        v.measure(View.MeasureSpec.makeMeasureSpec(dm.widthPixels, View.MeasureSpec.EXACTLY),
                View.MeasureSpec.makeMeasureSpec(dm.heightPixels, View.MeasureSpec.EXACTLY));
        v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
        Bitmap returnedBitmap = Bitmap.createBitmap(v.getMeasuredWidth(),
                v.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(returnedBitmap);
        v.draw(c);
    
        return returnedBitmap;
    }
    

    cardview jpeg 文件保存在 ExternalStorage 位置,文件名为 sid.jpg

    MyCompleted Activity

    public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        CardView cardView = (CardView) findViewById(R.id.card_view);
        loadView(cardView);
    }
    public void loadView(CardView cardView){
    
        try {
            cardView.setDrawingCacheEnabled(true);
            Bitmap bitmap =  loadBitmapFromView(cardView);
            cardView.setDrawingCacheEnabled(false);
    
            String mPath =
                    Environment.getExternalStorageDirectory().toString() + "/sid.jpg";
    
            File imageFile = new File(mPath);
            FileOutputStream outputStream = new
                    FileOutputStream(imageFile);
            int quality = 100;
            bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream);
            outputStream.flush();
            outputStream.close();
    
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }
    
    public Bitmap loadBitmapFromView(View v) {
        DisplayMetrics dm = getResources().getDisplayMetrics();
        v.measure(View.MeasureSpec.makeMeasureSpec(dm.widthPixels, View.MeasureSpec.EXACTLY),
                View.MeasureSpec.makeMeasureSpec(dm.heightPixels, View.MeasureSpec.EXACTLY));
        v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
        Bitmap returnedBitmap = Bitmap.createBitmap(v.getMeasuredWidth(),
                v.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(returnedBitmap);
        v.draw(c);
    
        return returnedBitmap;
    }
    
    }
    

    manifest文件上添加权限以保存jpeg文件

        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    

    【讨论】:

    • 关注了这个,但仍然没有文件。知道在哪里搜索文件吗?
    • @BaRud 在您的设备外部存储根目录中。
    • 啊哈...有没有办法把它放在下载目录中,因为我没有任何外部存储。
    • 其实在/Android/data/myapp中已经创建了文件。
    • @BaRud 我刚刚更新了我的代码,请检查它的工作正常。
    【解决方案3】:

    您正在传递按钮的视图对象。 您必须将布局膨胀为视图对象,然后将其传递给您的函数。 这可能会帮助你。 Create a Bitmap from a Layout/View before/without draw

    【讨论】:

    • 即使链接作为参考有用,请考虑通过例如使用有助于 OP 的具体示例或从链接中提取相关内容来改进您的答案。跨度>
    猜你喜欢
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 2011-11-04
    • 1970-01-01
    相关资源
    最近更新 更多