Извлеките данные из QR-кодов и создайте новый QR-код с цветом - PullRequest
0 голосов
/ 04 марта 2019

Кто-нибудь слышал об этом раньше?Извлеките QR Codes (все QR-коды должны иметь одинаковую ширину и высоту {квадрат}) и получить данные от каждого QR Code и объединить их.Затем получите значение каждого пикселя из каждого QR-кода и измените их на hexadecimal.Вы дадите #FFFFFFFF, #FF000000, #00000000 (белый, черный, прозрачный) и тому подобное (но для черного и белого QR Code это будет только 2 из них).Затем для каждого значения из каждого QR кода путем создания нового цвета QR Code, цвет которого соответствует значению каждого шестнадцатеричного значения, а содержимое нового цвета QR Code будет иметь содержимоекоторый был извлечен из предыдущего QR Codes.

Например, сейчас я извлекаю 8 чисел QR Code и объединяю содержимое, затем создаю новый colour QR Code.

Я застрял в середине процесса.Я успешно извлек содержимое и пиксель каждого QR Code, изменив значение на hexadecimal.проблема заключается в том, как я могу изменить значение hexadecimal с каждого цвета QR code на ARGB (альфа, красный, зеленый, синий) и создать новый цвет QR Code.

Однако яесть совет от Google, некоторые говорят, что MatrixToImageWriter было бы полезно.Но там не так много работы, которая была бы похожа и полезна для меня.Ну, мне нужна помощь здесь.Однако я не уверен, будет ли это полезно для меня или нет.

PS: я могу прикрепить сюда свою работу, если кто-то захочет.

PSS: Я использую Zxingбиблиотека для сканирования и получения результата от каждого QR Code.

Ответы [ 2 ]

0 голосов
/ 10 марта 2019

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

 QRCodeWriter qw = new QRCodeWriter();

try {
    HashMap<EncodeHintType, Object> hints = new HashMap<>();
    hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
    hints.put(EncodeHintType.MARGIN, margin);
    BitMatrix matrix = qw.encode(msg, BarcodeFormat.QR_CODE, width, height, hints);
    Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
    for (int x = 0; x < width; x++) {
        for (int y = 0; y < width; y++) {
            bmp.setPixel(x, y, matrix.get(x, y) ? Color.BLACK : Color.WHITE);
        }
    }
    return bmp;
} catch (WriterException e) {
    e.printStackTrace();
}

Чтобы изменить цвет QR-кода, и если у вас есть arraylist, как у меня, который хранит все строки hex,Вы можете использовать петли for и вставить строку hex.

Для изменения цвета на основе кода

 for (int x = 0; x < width; x++) {
    for (int y = 0; y < width; y++) {
        bmp.setPixel(x, y, matrix.get(x, y) ? Color.BLACK : Color.WHITE);
    }
}

Color.Black можно заменить на arraylist (в моем случае я заменяю его на colorArray) и Color.White - это цвет фона QR-кода.

Что ж, надеюсь, он когда-нибудь кому-нибудь поможет. Счастливое кодирование .

0 голосов
/ 06 марта 2019

Я только что написал нужные методы декодирования / кодирования;матрица выглядит иначе, потому что я создал входной QR-код с приложением QR Droid и выходной QR-код с ZXing , который может использовать другой уровень исправления ошибок;тем не менее, оба имеют один и тот же целевой URL, который является моим.

Зависимости происходят из репозиториев google() и mavenCentral():

dependencies {

    implementation "androidx.appcompat:appcompat:1.0.2"

    // https://mvnrepository.com/artifact/com.google.zxing
    implementation "com.google.zxing:core:3.3.3"
    implementation "com.google.zxing:android-core:3.3.0"
}

Используемый ресурс макета:

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:gravity="center">

    <androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/inputImage"
        android:src="@drawable/qrcode"
        android:layout_height="200dp"
        android:layout_width="200dp"
        android:padding="8dp"/>

    <androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/outputImage"
        android:layout_height="200dp"
        android:layout_width="200dp"
        android:padding="8dp"/>

</androidx.appcompat.widget.LinearLayoutCompat>

И манипуляции с BitMatrix;где метод encode() должен быть достаточным при наличии String;просто добавил оба метода ради полного примера (он читает Bitmap из одного AppCompatImageView и затем записывает в другой AppCompatImageView):

import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.util.Log;

import androidx.annotation.ColorInt;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.AppCompatImageView;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.NotFoundException;
import com.google.zxing.RGBLuminanceSource;
import com.google.zxing.Result;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;

public class MainActivity extends AppCompatActivity {

    private AppCompatImageView mInputImage;
    private AppCompatImageView mOutputImage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.layout_main);

        this.mInputImage = this.findViewById(R.id.inputImage);
        this.mOutputImage = this.findViewById(R.id.outputImage);

        Bitmap bitmap = ((BitmapDrawable) this.mInputImage.getDrawable()).getBitmap();
        String data = this.decode(bitmap);

        bitmap = this.encode(data, bitmap.getWidth(), bitmap.getHeight(), 0xFFFFD034,0xFF06425C);
        this.mOutputImage.setImageBitmap(bitmap);
    }

    private String decode(Bitmap bitmap) {

        String data = null;
        MultiFormatReader reader = new MultiFormatReader();
        int[] intArray = new int[bitmap.getWidth() * bitmap.getHeight()];
        bitmap.getPixels(intArray, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
        LuminanceSource source = new RGBLuminanceSource(bitmap.getWidth(), bitmap.getHeight(), intArray);
        BinaryBitmap binary = new BinaryBitmap(new HybridBinarizer(source));

        try {
            Result result = reader.decode(binary);
            data = result.getText();
        } catch (NotFoundException e) {
            e.printStackTrace();
        }

        Log.d("ZXing", "decoded: " + data);
        return data;
    }

    private Bitmap encode(String contents, int width, int height, @ColorInt int foreground, @ColorInt int background) {

        MultiFormatWriter writer = new MultiFormatWriter();
        BitMatrix matrix = null;
        Bitmap bitmap = null;

        try {
            matrix = writer.encode(contents, BarcodeFormat.QR_CODE, width, height);
        } catch (WriterException e) {
            e.printStackTrace();
        }

        if(matrix != null) {
            int[] pixels = new int[width * height];
            for (int y = 0; y < height; y++) {
                int offset = y * width;
                for (int x = 0; x < width; x++) {
                    pixels[offset + x] = matrix.get(x, y) ? foreground : background;
                }
            }
            bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
        }

        return bitmap;
    }
}

Результат выглядит примерно так;где левая - входная матрица, а правая - выходная:

QR Codes, Input & Output Matrix

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...