Как сгенерировать растровое изображение?

Я хочу написать программу получения Android, написав текст, setLogo и изображение в растровое изображение. У меня был поиск в Интернете, но ни один из них не имеет отношения к тому, чего я пытаюсь достичь. Есть ли шанс, что я смогу это сделать?

Формат вывода моей квитанции выглядит следующим образом:

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

К вашему сведению, моя цель - позволить пользователю просмотреть квитанцию, прежде чем терминал распечатает квитанцию. В функции printReceipt будет выполняться все задание по созданию растрового изображения квитанции, а функция printPreview установит растровое изображение в imageView.

Пример в реальном мире: - Чек супермаркета, данные будут увеличиваться, когда мы покупаем много товаров, и я пытаюсь записать эти данные в растровое изображение и распечатать его или отправить по электронной почте.

у вас есть определенный layout.xml для проверки квитанции, верно? где вы показываете его пользователю перед печатью.

Anjana 14.06.2019 05:18

@Anjana Ага, будет printPreview.xml, а растровое изображение будет установлено в ImageView. Пользователь может решить, распечатать его через терминал или отправить по почте.

Nicholas 14.06.2019 05:44

Так что, если вы можете сгенерировать растровое изображение из макета printPreview, решит ли это вашу проблему?

Anjana 14.06.2019 05:46

@Anjana Я думаю, я понимаю, что вы пытаетесь сказать, это почти как шаблон для квитанции, и мне просто нужно захватить весь шаблон и сохранить его как растровое изображение, верно?

Nicholas 14.06.2019 06:04

Просто я говорю о преобразовании макета printPreview в изображение.

Anjana 14.06.2019 06:10

@Anjana О, спасибо, это может быть альтернативный способ, я рассмотрю это решение, посмотрю, есть ли какое-либо представление, которое позволит мне обрабатывать ввод больших данных (например, длинная квитанция в супермаркете), спасибо!

Nicholas 14.06.2019 06:35

проверьте предложенные ответы ниже.

Anjana 14.06.2019 07:07
0
7
1 798
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я думаю, вы написали неправильный заголовок. Если вы хотите разработать квитанцию, вам нужно создать ее с помощью дизайна макета 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 вы увидите вот так

Теперь вы можете добавить значения в свои текстовые представления. И затем, если вы хотите преобразовать этот экран в растровое изображение, вы можете сделать снимок экрана.

Надеюсь это поможет.

Спасибо за ответ и напоминание об исправлении заголовка, но это не то, чего я пытаюсь добиться.

Nicholas 14.06.2019 05:14

Тогда чего вы пытаетесь достичь.. подробно объясните, что именно вы хотите сделать.

Belal Khan 14.06.2019 06:03

Я понимаю, что ваше решение предоставлено, весь xml будет действовать как квитанция. Но мне интересно, есть ли какое-либо решение для прямого рисования всех данных в растровое изображение вместо того, чтобы захватывать их и сохранять в виде растрового изображения. Это то, чего я пытаюсь достичь, потому что мои данные будут продолжать увеличиваться, поэтому я стараюсь не исправлять их в xml и использовать способ снимка экрана, будет проблема, когда мои данные превысят разрешение экрана, я думаю, снимок экрана не будет быть в состоянии захватить получение, что из разрешения экрана. Представьте, что вы покупаете много товаров в супермаркете, и чек будет очень длинным.

Nicholas 14.06.2019 06:22

Вы думаете об очень неправильном подходе. Вы также можете генерировать XML из кода, поэтому не имеет значения, какой объем данных у вас есть, даже если у вас есть переменные данные, вы можете кодировать и генерировать XML динамически. Рисование BITMAP также возможно, но это действительно очень плохая идея, и вам нужно написать очень сложный код, работающий с холстом, фигурами и текстом.

Belal Khan 14.06.2019 06:41
Ответ принят как подходящий

Вы можете преобразовать представление макета непосредственно в растровое изображение, используя приведенный ниже код.

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.

Вы можете превратить свой View в Bitmap.

Из ответа здесь Android Преобразовать представление в 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 с нуля. Вот библиотека, которая может отображать текст и изображение в данные изображения (массив байтов), которые вы можете превратить в Bitmap. Графика 2D. Вот его основное использование Преобразование текстового содержимого в изображение

Другие вопросы по теме