【问题标题】:How to generate Bitmap?如何生成位图?
【发布时间】:2019-10-28 15:20:09
【问题描述】:

我想通过将文本、setLogo 和图像写入 Bitmap 来编写一个 android 收据程序。我通过互联网进行了搜索,但没有一个与我想要实现的目标相关。反正我能做到吗?

我的收据输出格式如下:

 _____________
| *********** |
| *  Logo   * | 
| *********** |
| Date        |
| Amount      |
| Card No     |
|             |
| Signature   |
|_____________|

供您参考,我的目的是让用户在终端打印收据之前查看收据。在 printReceipt 函数中将完成所有生成收据位图的工作,而 printPreview 函数将把位图设置为 imageView。

现实世界的例子:- 超市收据,当我们购买大量商品时,数据会不断增加,我正在尝试将这些数据写入位图并打印出来或通过电子邮件发送。

【问题讨论】:

  • 您有一个特定的 layout.xml 用于接收审核,对吗?在打印之前向用户展示它。
  • @Anjana 是的,会有一个 printPreview.xml 并且位图将设置到 ImageView 中。用户可以决定是通过终端打印还是通过邮件发送。
  • 那么,如果您可以从 printPreview 布局生成位图,会解决您的问题吗?
  • @Anjana 我想我明白你想说什么,几乎就像一个收据模板,我只需要捕获整个模板并将其存储为位图对吗?
  • 我只是说将 printPreview 布局视图转换为图像。

标签: android bitmap receipt


【解决方案1】:

我猜你写错了标题。如果要设计收据,则必须使用 XML 布局设计进行设计。对于您的收据,我有这个设计。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:padding="16dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">


    <ImageView
            android:id="@+id/imageview"
            android:layout_centerHorizontal="true"
            android:background="@mipmap/ic_launcher"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

    <TableLayout
            android:stretchColumns="*"
            android:layout_marginTop="20dp"
            android:layout_below="@id/imageview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

        <TableRow>

            <TextView
                    android:textAppearance="@style/TextAppearance.AppCompat.Large"
                    android:text="Date"
            />

            <TextView
                    android:id="@+id/text_view_date"
                    android:textAppearance="@style/TextAppearance.AppCompat.Large"
                    tools:text="14/06/2019"
            />

        </TableRow>

        <TableRow>

            <TextView
                    android:textAppearance="@style/TextAppearance.AppCompat.Large"
                    android:text="Amount"
            />

            <TextView
                    android:id="@+id/text_view_amount"
                    android:textAppearance="@style/TextAppearance.AppCompat.Large"
                    tools:text="$120"
            />

        </TableRow>

        <TableRow>

            <TextView
                    android:textAppearance="@style/TextAppearance.AppCompat.Large"
                    android:text="Card Number"
            />

            <TextView
                    android:id="@+id/text_view_card_number"
                    android:textAppearance="@style/TextAppearance.AppCompat.Large"
                    tools:text="4587 8983 7456 2233"
            />

        </TableRow>

        <TableRow>

            <TextView
                    android:textAppearance="@style/TextAppearance.AppCompat.Large"
                    android:text="Signature"
            />

            <ImageView
                    android:background="@mipmap/ic_launcher"
            />

        </TableRow>


    </TableLayout>

</RelativeLayout>

你会看到这样的 XML

现在您可以将值添加到您的文本视图中。然后,如果您想将此屏幕转换为位图,您可以截取屏幕截图。

希望这会有所帮助。

【讨论】:

  • 感谢您的回答和标题更正提醒,但这不是我想要实现的。
  • 那么你想要达到的目标..详细解释你到底想做什么。
  • 我了解您提供的解决方案,整个 xml 将作为收据。但我想知道是否有任何解决方案可以将所有数据直接绘制到位图中,而不是捕获它并存储为位图。这就是我想要实现的,因为我的数据会不断增加,这就是为什么我尽量不在xml中修复它并使用截图的方式,当我的数据超过屏幕分辨率时会出现问题我猜截图不会能够捕获超出屏幕分辨率的收据。想象一下你在超市买了很多东西,收据会很长吧。
  • 您正在考虑一个非常错误的方法。您也可以从代码生成 XML,因此无论您拥有多少数据,即使您有可变数据,您也可以动态编码和生成 XML。也可以绘制 BITMAP,但这确实是一个非常糟糕的主意,您需要编写非常复杂的代码,处理画布、形状和文本。
【解决方案2】:

您可以使用以下代码将布局视图直接转换为位图。

View v = printPreviewLayout;
Bitmap bmp = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);

Canvas c = new Canvas(bmp);
v.draw(c);

try{
    File file =  new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Image_" + System.currentTimeMillis() + ".png");
    FileOutputStream out = new FileOutputStream(file);
    bmp.compress(Bitmap.CompressFormat.PNG, 90, out);
    out.close();
    MediaScannerConnection.scanFile(mContext, new String[] { file.toString() }, null,new MediaScannerConnection.OnScanCompletedListener() {
        public void onScanCompleted(String path, Uri uri) {
            Log.i("ExternalStorage", "Scanned " + path + ":");
            Log.i("ExternalStorage", "-> uri=" + uri);
        }
   });
   Toast.makeText(mContext, "Image downloaded to"+file.toString(), Toast.LENGTH_LONG).show();
}

这将绘制一个 printPreviewLayout 视图的位图。

【讨论】:

    【解决方案3】:

    您可以将您的View 变成Bitmap

    从这里的答案Android Convert view to BitMap

    private Bitmap createBitmapFromView(Context context, View view) {
            DisplayMetrics displayMetrics = new DisplayMetrics();
            ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
            view.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    
            view.measure(displayMetrics.widthPixels, displayMetrics.heightPixels);
            view.layout(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels);
            view.buildDrawingCache();
            Bitmap bitmap = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
    
            Canvas canvas = new Canvas(bitmap);
            view.draw(canvas);
    
            return bitmap;
        }
    

    但如果你真的想从头开始创建Bitmap。这是一个可以将文本和图像绘制成图像数据(字节数组)的库,您可以将其转换为BitmapGraphics 2D。这是它的基本用法Convert text content to Image

    【讨论】:

      猜你喜欢
      • 2014-05-20
      • 1970-01-01
      • 2011-04-25
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多