Подтвердить что ты не робот

Уменьшить ширину границы на QR-кодах, созданных ZXing?

Я использую com.google.zxing.qrcode.QRCodeWriter для кодирования данных и com.google.zxing.client.j2se.MatrixToImageWriter для генерации изображения QR-кода. На изображении 400x400 вокруг кода около ширины шириной 52 пикселя. Я бы хотел, чтобы эта граница была уже, может быть, 15 пикселей, но я ничего не вижу в API для этого. Я что-то пропустил в документе? Или мне нужно обработать изображение самостоятельно?

Для справки, вот пример QR-кода 400x400, созданного с помощью библиотеки ZXing:

An example QR Code

4b9b3361

Ответ 1

В спецификации QR требуется четырехмерная тихая зона и что создается zxing. (См. QUIET_ZONE_SIZE в QRCodeWriter.renderResult.)

В более поздних версиях ZXing вы можете установить размер тихой зоны (в основном внутреннее дополнение QR-кода), указав значение int EncodeHintType.MARGIN. Просто включите его в подсказки Map, которые вы передаете методу Writer encode(...), например:

Map<EncodeHintType, Object> hints = new EnumMap<EncodeHintType, Object>(EncodeHintType.class);
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
hints.put(EncodeHintType.MARGIN, 2); /* default = 4 */

Если вы измените это, вы рискуете снизить скорость успеха декодирования.

Ответ 2

Даже если установить EncodeHintType.MARGIN на 0, алгоритм, который преобразует матрицу "точка" QRCode в пиксельные данные, может генерировать небольшой запас (алгоритм обеспечивает постоянное количество пикселей на точки, поэтому размер пикселя поля оставшаяся часть целочисленного деления размера пикселей по размеру QR-кода).

Однако вы можете полностью обойти это поколение "точка-пиксель": вы вычисляете матричную матрицу QRCode напрямую, вызывая общедоступный класс com.google.zxing.qrcode.encoder.Encoder, и сами генерируете пиксельное изображение. Код ниже:

// Step 1 - generate the QRCode dot array
Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>(1);
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
QRCode qrCode = Encoder.encode(what, ErrorCorrectionLevel.L, hints);

// Step 2 - create a BufferedImage out of this array
int width = qrCode.getMatrix().getWidth();
int height = qrCode.getMatrix().getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
int[] rgbArray = new int[width * height];
int i = 0;
for (int y = 0; y < height; y++) {
  for (int x = 0; x < width; x++) {
    rgbArray[i] = qrCode.getMatrix().get(x, y) > 0 ? 0xFFFFFF : 0x000000;
    i++;
} }
image.setRGB(0, 0, width, height, rgbArray, 0, width);

Преобразование данных BufferedImage в PNG остается в виде упражнения для читателя. Вы также можете масштабировать изображение, установив фиксированное количество пикселей на точки.

Как правило, он более оптимизирован таким образом, сгенерированный размер изображения является наименьшим возможным. Если вы полагаетесь на клиента для масштабирования изображения (без размытия), вам не нужно больше 1 пикселя на точку.

Ответ 3

    HashMap hintMap = new HashMap();
    hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.Q);
    hintMap.put(EncodeHintType.MARGIN, -1);

нет поля

UPDATE

Добавить зависимости (из комментариев)

<dependency>
    <groupId>com.google.zxing</groupId> 
    <artifactId>core</artifactId> 
    <version>3.2.0</version>
    <type>jar</type> 
</dependency> 
<dependency> 
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId> 
    <version>3.2.0</version> 
</dependency>

Ответ 4

В быстро вы можете:

let hints = ZXEncodeHints()
hints!.margin = NSNumber(int: 0)

let result = try writer.encode(code, format: format, width: Int32(size.width), height: Int32(size.height), hints: hints)
let cgImage = ZXImage(matrix: result, onColor: UIColor.blackColor().CGColor, offColor: UIColor.clearColor().CGColor).cgimage
let QRImage = UIImage(CGImage: cgImage)