1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/CasterWx-BitQR-Code

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
QR-Code.md 11 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 25.11.2024 07:30 1829ec5

BitQR-Code

Through image generate QR-Code.

Один из элегантных генераторов QR-кодов.

Адрес проекта на Github: https://github.com/CasterWx/BitQR-Code.


Пример

Возьмите свой телефон и попробуйте отсканировать следующий QR-код!

Исходное изображение Версия 3
Версия 5 Непосредственно составленный GIF Разложение для генерации
Исходный рисунок 1 Исходный рисунок 2 Исходный рисунок 3
GIF1 GIF2 GIF3

Разложение GIF на несколько кадров

Исходный GIF Четвёртый кадр Седьмой кадр Десятый кадр
Тринадцатый кадр Шестнадцатый кадр Двадцатый кадр Генерация GIF

Последняя статья 2018 года

Ссылка

В проекте импортируйте QRCode.jar, чтобы добавить зависимость:

<component name="libraryTable">
  <library name="QRCode">
    <CLASSES>
      <root url="jar://$PROJECT_DIR$/src/lib/QRCode.jar!/" />
    </CLASSES>
    <JAVADOC />
    <SOURCES />
  </library>
</component>

Быстрый старт

1. «Быстрый импорт фонового изображения»

Просто хочу отобразить фотографию девушки в школьной форме

BufferedImage writeImg = ImageIO.read(new File("школьная форма.jpg"));
BufferedImage bf = new BufferedImage(writeImg.getWidth(),writeImg.getHeight(),BufferedImage.TYPE_INT_RGB);
Graphics2D gs = bf.createGraphics() ;
gs.clearRect(0,0,bf.getWidth(),bf.getHeight());
gs.drawImage(writeImg,0,0,bf.getWidth(),bf.getHeight(),null);

writeImg — это прочитанное изображение, затем создаётся Graphics с размером, соответствующим этой фотографии.

gs.drawImage(writeImg,0,0,bf.getWidth(),bf.getHeight(),null);

Теперь можно нарисовать writeImg на Graphics.

Эффект

2. «Использование кисти на изображении»

Graphics2D gs = bf.createGraphics() ;
gs.setBackground(Color.white);
gs.clearRect(0,0,bf.getWidth(),bf.getHeight());
gs.drawImage(writeImg,0,0,bf.getWidth(),bf.getHeight(),null);

gs — это созданный холст, setBackground позволяет установить его цвет фона, также можно напрямую использовать drawImage() для рисования изображения.

gs.setColor(Color.BLACK);
gs.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,1.0f));
gs.fillRect(j*mini+begin,i*mini+begin,mini,mini );
  • setColor используется для установки цвета кисти.
  • setComposite используется для настройки прозрачности.
  • fillRect — действие рисования, параметры представляют собой начальную и конечную координаты.

3. «Суть QR-кода заключается в ________»

Суть QR-кода состоит в двоичном представлении данных

Чёрно-белые квадраты QR-кода фактически представляют биты данных 0 и 1, нам нужно только преобразовать данные в массив байтов, а затем непосредственно нарисовать их на изображении в соответствии с массивом значений 0–1, чтобы создать соответствующий QR-код. qrcode.calQrcode(contentByte);

Таким образом можно создать массив cidesOut для представления чёрных и белых квадратов двумерного кода.

qrcode — это конфигурация генерации двумерного кода, включая коэффициент коррекции ошибок и версию Qrcode.

Qrcode qrcode = new Qrcode();
qrcode.setQrcodeErrorCorrect('M');
qrcode.setQrcodeEncodeMode('B');
qrcode.setQrcodeVersion(3);

4. «Чёрно-белая рубашка!!!»

Двумерный код по своей сути является чёрно-белой рубашкой!!!

Двойной цикл for проходит по массиву cidesOut типа boolean, если значение true, то рисуется чёрный квадрат.

for (int i = 0; i < cidesOut.length; i++) {
    for (int j = 0; j < cidesOut.length; j++) {
        if (cidesOut[j][i]) {
            gs.fillRect(j * mini + begin, i * mini + begin, mini, mini);
        }
    }
}

Создание кадров анимированного GIF

1. «Как нарисовать GIF»

AnimatedGifEncoder e = new AnimatedGifEncoder();
e.setRepeat(0);
e.start(newPic);
BufferedImage src[] = new BufferedImage[pic.length];
for (int i = 0; i < src.length; i++) {
    e.setDelay(playTime);
    src[i] = ImageIO.read(new File(pic[i]));
    e.addFrame(src[i]); // Добавление в кадр
}
e.finish();

Сначала определяется класс для создания GIF.

AnimatedGifEncoder e = new AnimatedGifEncoder();

e.start(newPic);

newPic представляет имя файла сгенерированного gif.

e.setDelay(playTime);

Устанавливается время задержки воспроизведения playTime.

e.setDelay(playTime);

src[i] = ImageIO.read(new File(pic[i])); e.addFrame(src[i]);

Наконец, изображение BufferedImage добавляется в кадр.

e.finish();

GIF

2. «Как разделить GIF на кадры»

  • Загрузить gif
GifDecoder gd = new GifDecoder();// Изображение для обработки
int status = gd.read(new FileInputStream(new File("marry.gif")));
if (status != GifDecoder.STATUS_OK) {
  return;
}
  • Количество кадров в GIF равно gd.getFrameCount();

Мы можем напрямую получить изображение каждого кадра и сохранить его локально.

for (int i = 0; i < gd.getFrameCount(); i++) {
  // Получение кадра GIF
  BufferedImage frame = gd.getFrame(i);
  // Сохранение кадра локально
}

После разделения GIF на кадры мы можем добавить двумерный код к каждому кадру, а затем включить их в новый GIF.

  for (int i = 0; i < gd.getFrameCount(); i++) {
    // Получение кадра GIF
    BufferedImage frame = gd.getFrame(i);
    Graphics2D gs = frame.createGraphics() ;
    gs.drawImage(frame,0,0,frame.getWidth(),frame.getHeight(),null);
    int qrLength = frame.getHeight()-2*frame.getHeight()/10 ;
    int mini = qrLength/cidesOut.length ;
    int begin = (frame.getWidth() - mini*cidesOut.length)/2 ;
    for(int k=0;k<cidesOut.length;k++){
      for(int j=0;j<cidesOut.length;j++){
        if(cidesOut[j][k]){
          gs.setColor(Color.BLACK);
          gs.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,1.0f));
          gs.fillRect(j*mini+begin,k*mini+begin/4,mini,mini );
        }
      }
    }

  int delay = gd.getDelay(i);
  ge.setDelay(delay);
  ge.addFrame(frame);
Исходное изображение GIF
Исходное изображение GIF
Исходное изображение GIF

Пожертвования

Платёжная система Alipay Платёжная система WeChat

BitQR-Code — это открытый проект, который можно использовать бесплатно. Однако по мере роста проекта ему также требуется соответствующее финансирование для поддержания и развития. Вы можете поддержать разработку BitQR-Code следующими способами. Ваше имя будет указано в репозитории GitHub и документации блога BitQR-Code.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/CasterWx-BitQR-Code.git
git@api.gitlife.ru:oschina-mirror/CasterWx-BitQR-Code.git
oschina-mirror
CasterWx-BitQR-Code
CasterWx-BitQR-Code
master