Почему мои jpeg QR-коды от ZXing не черно-белые? - PullRequest
4 голосов
/ 10 мая 2011

Я использую код ZXing для создания QR-кодов.Я получил пример кода здесь: http://www.vineetmanohar.com/2010/09/java-barcode-api/, и изображение в формате PNG выглядит хорошо, черно-белое, как и ожидалось.

В комментариях к примерам кода упоминается, что я мог использовать формат tiff или jpeg, поэтому я изменил переменную imgeFormat на jpeg.Создается правильное изображение QR-кода, но вместо того, чтобы быть черно-белым, «белая» часть имеет персиковый цвет, а «черная» - синий.

Я вырезал и вставил код ZXing MatrixToImageWriter в свой код и установил цвета вместо использования int BLACK = 0xFF000000;и int WHITE = 0xFFFFFFFF;Я обнаружил, что, заменив переменную BLACK на 0x00000000, я получил черный цвет на своем изображении, но мне не удалось найти значение для переменной WHITE, которое дает мне белый цвет.

Прикрепленный QR-код нечетного цвета. К сожалению, я слишком новичок в пользователе, чтобы прикрепить изображение.Надеемся, что эта ссылка на imgur.com работает: http://imgur.com/QnNXO

Вот код Java:

package zxing_qr;

import java.io.File;
import java.io.FileOutputStream;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

// by passing MatrixToImageWriter call
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.Graphics2D;


public class Main {


public static void main(String[] args) {
    //String text = "98376373783"; // this is the text that we want to encode
    String text = "blahblahblah"; // this is the text that we want to encode

    int width = 400;
    int height = 300; // change the height and width as per your requirement

    // (ImageIO.getWriterFormatNames() returns a list of supported formats)
    String imageFormat = "jpg"; // could be "gif", "tiff", "jpeg"

    try {
        BitMatrix bitMatrix = new QRCodeWriter().encode(text, BarcodeFormat.QR_CODE,     width, height);
        MatrixToImageWriter.writeToStream(bitMatrix, imageFormat, new FileOutputStream(new File("qrcode_97802017507991.jpg")));             
    } catch (WriterException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
} // end main function
} // end main class

Ответы [ 3 ]

3 голосов
/ 11 мая 2011

Я наткнулся на ответ.Внутри класса ZXing MatrixToImageWriter создается объект BufferedImage с BufferedImage.TYPE_INT_ARGB в качестве 3-го аргумента.Изменяя это на BufferedImage.TYPE_INT_RGB, цвета для JPEG становятся черно-белыми, как и ожидалось.

0 голосов
/ 19 июня 2015

Или вы можете сделать свое собственное преобразование из BitMatrix в буферизованное изображение

private static BufferedImage drawCodeOnImage(BitMatrix bitMatrix) {

    if (bitMatrix == null) {
        throw new IllegalArgumentException("BitMatrix cannot be null");
    }

    int width = bitMatrix.getWidth();
    int height = bitMatrix.getHeight();

    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_INDEXED);
    image.createGraphics();

    Graphics2D graphics = (Graphics2D) image.getGraphics();
    graphics.setColor(Color.WHITE);
    graphics.fillRect(0, 0, width, height);
    graphics.setColor(Color.BLACK);

    for (int i = 0; i < width; i++) {
        for (int j = 0; j < height; j++) {
            if (bitMatrix.get(i, j)) {
                graphics.fillRect(i, j, 1, 1);
            }
        }
    }

    return image;
}

Я использовал BufferedImage.TYPE_BYTE_INDEXED, потому что в формате GIF запись в OutputStream выполняется быстрее.

цвет, определенный как 0x00 .. является прозрачным, цвет, определенный как 0xFF ..., является непрозрачным в соответствии с Android-цветами .Эти цвета уже используются в вызове

MatrixToImageWriter.writeToStream(bitMatrix, imageFormat, new FileOutputStream(new File("qrcode_97802017507991.jpg")));

в качестве конфигурации по умолчанию.

0 голосов
/ 14 августа 2014

Вместо взлома классов ZXing вы также можете программно конвертировать пиксели изображения в RGB:

      ...
        final BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(matrix);
        final BufferedImage rgbImage = convertARGBtoRGB(bufferedImage);
      ...

  private static BufferedImage convertARGBtoRGB(final BufferedImage argb) {
    assert argb.getType() == BufferedImage.TYPE_INT_ARGB;
    final int width = argb.getWidth();
    final int height = argb.getHeight();
    final BufferedImage rgbImage= new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    for (int x = 0; x < width; x++) {
      for (int y = 0; y < height; y++) {
        rgbImage.setRGB(x, y, argb.getRGB(x, y));
      }
    }
    return rgbImage;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...