色付きQRコードをZXingライブラリでJavaでデコードしようとしています。いくつかの研究から、私はZXingがすでにこれを行う能力を持っていることを知っています。しかし、私は2日間これをやってきました。私がやったことは、ファイルからQRイメージを読んで、イメージの中で最も暗くて明るい色を計算しようとしています。次に、すべてのフォアグラウンドピクセルを黒に変更し、他のものを白に変更します。この後、標準のQRコードと同じようにQRコードを取得します。次に、QRコードを読み取る関数を使用します。JavaでZXingライブラリを使用してカラー画像をデコードする
ただし、これは2色のQRコードでのみ機能し、3色になるとほとんどの場合は機能しません。ただし、カラー画像からグレー画像に変換された新しい画像は、エラー訂正率を超えてはなりません。
私は他の方法を試みましたが、それぞれの方法は、特定の種類のQRコード(ロゴ、マルチカラー、形状のファインダーパターンなど)のためだけに働いていました。
私が探しているのは、あらゆる種類のQRコードをデコードする方法です。少なくとも多色で整形されたファインダーパターンの場合。これは私がロゴの事のようなもので(第三QRを復号化するためにも使用さthisページ(第2 QR)の上に緑のQRを復号化するために使用しているコードがある
:詳細については
同じウェブサイトをご覧ください)アライメントパターン上に間違いなく
public class Decoder { public static void main(String[] args) { // input image file File imageFile = new File("/Users/Desktop/QR/green.png"); BufferedImage image = null; try { image = ImageIO.read(imageFile); } catch (IOException e) { System.out.println("io outch"); } int imageWidth = image.getWidth(); int imageHeight = image.getHeight(); int total = 0; int dark = image.getRGB(0, 0); int light = image.getRGB(0, 0); int backgroundColor = 0; int foregroundColor = 0; FinderPattern topLeftFinder; for (int x = 0; x < imageWidth; x ++) { for (int y = 0; y <imageHeight; y ++) { total = total + image.getRGB(x, y); } } //int average = total/(imageWidth * imageHeight); //System.out.println("total" + total + " average " + average); for (int x = 0; x < imageWidth; x ++) { for (int y = 0; y <imageHeight; y ++) { if (image.getRGB(x, y) < dark) { dark = image.getRGB(x, y); } if (image.getRGB(x, y) > light) { light = image.getRGB(x, y); } } } for (int x = 0; x < imageWidth; x ++) { for (int y = 0; y <imageHeight; y ++) { if (image.getRGB(x, y) >= (dark - light)/4) { image.setRGB(x, y, -1); } else if (image.getRGB(x, y) <= (dark - light) * 3/4) { image.setRGB(x, y, -16777216); } else { image.setRGB(x, y, -1); } } } System.out.println("total" + dark + " average " + light); File outputFile = new File("/Users/Desktop/QR/outputQR.png"); //ImageIO.write(image, "png", file); try { ImageIO.write(image, "png", outputFile); } catch (IOException e) { System.out.println(e.getMessage()); } // creating binary bitmap from source image LuminanceSource lumSource = new BufferedImageLuminanceSource(image); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(lumSource)); Hashtable<DecodeHintType, Object> hint = new Hashtable<DecodeHintType, Object>(); hint.put(DecodeHintType.TRY_HARDER, BarcodeFormat.QR_CODE); // decoding QRCodeReader QRreader = new QRCodeReader(); Result result = null; try { result = QRreader.decode(bitmap, hint); } catch (ReaderException e) { System.out.println("error during reading"); } // getting output text String decodedText = result.getText(); System.out.println(decodedText); } }
ワーキングそして、これはもともと正常に動作しているが、それは今働いていない理由を知らないthis QRを復号化するために使用されるコードでされていません。そして、このコードは上記のQRを解読しません。 QRコードをマングリング
public class Decoder { public static void main(String[] args) { // input image file File imageFile = new File("/Users/Desktop/QR/bigfinderQR.png"); BufferedImage image = null; try { image = ImageIO.read(imageFile); } catch (IOException e) { System.out.println("io outch"); } // creating binary bitmap from source image LuminanceSource lumSource = new BufferedImageLuminanceSource(image); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(lumSource)); Hashtable<DecodeHintType, Object> hint = new Hashtable<DecodeHintType, Object>(); hint.put(DecodeHintType.TRY_HARDER, BarcodeFormat.QR_CODE); // decoding QRCodeReader QRreader = new QRCodeReader(); Result result = null; try { result = QRreader.decode(bitmap, hint); } catch (ReaderException e) { System.out.println("error during reading"); } // getting output text String decodedText = result.getText(); System.out.println(decodedText); }
}
こんにちは、私はオリジナルの投稿を編集しました。これらの変更を確認して、私が探しているものを教えてください。私がやっていることは、ZXingライブラリでJavaを使ってデコーダ/バリデータを設計することです。私の英語はそれほど良いものではないので、私が混乱させるものを作ってくれたら、私に知らせてください。ありがとう。 – user1139921
あなたが言ったことのもう一つのことは、「コーナーをちょっと丸めても問題ありません。各コードワードまたはモジュールをどれだけ丸めるか、または歪めることができるかについての制限がありますが、デコーダは引き続き読み取ることができます。 – user1139921
私は厳しい制限を与えることができませんでした。私は、デコーダが縦横に1:1:3:1:1の比率でプラスとマイナスの小さなファクタを白黒で見ている点を探します。驚くほど寛大ですが、これはイメージの領域であり、少なくとも混乱させるべきです。 –