kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
James Sumners
James Sumners
Вопрос

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

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

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

Пример QR-кода

35 2012-04-13T14:30:01+00:00 4
Программирование
zxing
Решение / Ответ
 smparkes
smparkes
13-го апреля 2012 в 2:53
2012-04-13T14:53:33+00:00
Дополнительно
Источник
Редактировать
#15931758

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

Более поздние версии ZXing позволяют задавать размер тихой зоны (по сути, внутренняя прокладка QR-кода), предоставляя значение int с ключом EncodeHintType.MARGIN. Просто включите его в карту подсказок Map, которую вы передаете методу Writer's 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 */

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

 Mudlabs
Mudlabs
Редактировал ответ 15-го февраля 2019 в 9:38
70
0
Laurent Gr&#233;goire
Laurent Grégoire
14-го февраля 2013 в 10:58
2013-02-14T10:58:26+00:00
Дополнительно
Источник
Редактировать
#15931759

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

Однако вы можете полностью обойти эту генерацию "точки в пиксель": вычислите матрицу точек 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 пикселя на точку.

9
0
 ougalejo
ougalejo
21-го апреля 2015 в 4:13
2015-04-21T16:13:21+00:00
Дополнительно
Источник
Редактировать
#15931760
    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>
Ernesto Campohermoso
Ernesto Campohermoso
Редактировал ответ 3-го января 2018 в 10:25
2
0
Luca Davanzo
Luca Davanzo
30-го октября 2015 в 4:11
2015-10-30T16:11:25+00:00
Дополнительно
Источник
Редактировать
#15931761

В Стриж вы можете:

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)
1
0
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 1 день назад
2
Денис Васьков
Зарегистрирован 2 дня назад
3
Dima Patrushev
Зарегистрирован 4 дня назад
4
sirojidddin otaboyev
Зарегистрирован 1 неделю назад
5
Елена Гайдамамакинат
Зарегистрирован 1 неделю назад
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией