2010-03-21 13 views
34

का उपयोग कर क्यूआर कोड एन्कोडिंग और डिकोडिंग ठीक है, इसलिए मैं इस मौके को दूर करने जा रहा हूं कि यहां किसी ने पहले ज़क्सिंग का उपयोग किया है। मैं जावा एप्लिकेशन विकसित कर रहा हूं, और उन चीजों में से एक जो इसे करने की ज़रूरत है, एक क्यूआर कोड में डेटा के बाइट सरणी को एन्कोड करना है और फिर इसे बाद में डीकोड करना है।ज़ेडिंग

byte[] b = {0x48, 0x45, 0x4C, 0x4C, 0x4F}; 
//convert the byte array into a UTF-8 string 
String data; 
try { 
    data = new String(b, "UTF8"); 
} 
catch (UnsupportedEncodingException e) { 
//the program shouldn't be able to get here 
return; 
} 

//get a byte matrix for the data 
ByteMatrix matrix; 
com.google.zxing.Writer writer = new QRCodeWriter(); 
try { 
matrix = writer.encode(data, com.google.zxing.BarcodeFormat.QR_CODE, width, height); 
} 
catch (com.google.zxing.WriterException e) { 
//exit the method 
return; 
} 

//generate an image from the byte matrix 
int width = matrix.getWidth(); 
int height = matrix.getHeight(); 

byte[][] array = matrix.getArray(); 

//create buffered image to draw to 
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 

//iterate through the matrix and draw the pixels to the image 
for (int y = 0; y < height; y++) { 
for (int x = 0; x < width; x++) { 
    int grayValue = array[y][x] & 0xff; 
    image.setRGB(x, y, (grayValue == 0 ? 0 : 0xFFFFFF)); 
} 
} 

//write the image to the output stream 
ImageIO.write(image, "png", outputStream); 

इस कोड में शुरुआत बाइट सरणी बस इसे परीक्षण करने के लिए प्रयोग किया जाता है:

यहाँ मेरी एनकोडर कैसा दिखता है, इसका एक उदाहरण। वास्तविक बाइट डेटा अलग-अलग होगा।

यहाँ मेरी विकोडक की तरह दिखता है:

//get the data from the input stream 
BufferedImage image = ImageIO.read(inputStream); 

//convert the image to a binary bitmap source 
LuminanceSource source = new BufferedImageLuminanceSource(image); 
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); 

//decode the barcode 
QRCodeReader reader = new QRCodeReader(); 

Result result; 
try { 
result = reader.decode(bitmap, hints); 
} catch (ReaderException e) { 
//the data is improperly formatted 
throw new MCCDatabaseMismatchException(); 
} 

byte[] b = result.getRawBytes(); 
System.out.println(ByteHelper.convertUnsignedBytesToHexString(result.getText().getBytes("UTF8"))); 
System.out.println(ByteHelper.convertUnsignedBytesToHexString(b)); 

convertUnsignedBytesToHexString(byte) एक तरीका है जिसके हेक्साडेसिमल वर्णों की स्ट्रिंग में बाइट्स की एक सरणी परिवर्तित करता है।

जब मैं कोड के इन दो ब्लॉकों एक साथ चलाने का प्रयास, यह उत्पादन होता है:

48454c4c4f 
202b0b78cc00ec11ec11ec11ec11ec11ec11ec 

जाहिर पाठ इनकोडिंग की जा रही है, लेकिन डेटा का वास्तविक बाइट्स पूरी तरह से बंद कर रहे हैं। किसी भी मदद की सराहना की जाएगी।

+0

captureActivity कब्जा QR कोड छवि और इसे डीकोड के बाद, यह क्यूआर कोड में संग्रहीत डेटा के प्रकार के अनुसार परिणाम दिखाता है। जैसे यदि वेबसाइट यूआरएल क्यूआर कोड में एन्कोड किया गया है, तो परिणाम स्क्रीन में उस यूआरएल और Likevise को खोलने के लिए एक बटन होगा। मुझे एसडी कार्ड से छवि पढ़ने की ज़रूरत है, इसे डीकोड करें और कैप्चर एक्टिविटी के माध्यम से डिकोडिंग के मामले में आउटपुट को उसी तरह से संभालें। "परिणाम परिणाम" में आउटपुट प्राप्त करने के बाद मुझे क्या करने की ज़रूरत है? –

+0

आपको अपने कोड के उदाहरणों के साथ यह एक नया प्रश्न पोस्ट करना चाहिए। आपको यहां प्रदान करने के मुकाबले बेहतर जवाब मिलेगा। – LandonSchropp

उत्तर

44

तो, किसी भी व्यक्ति के लिए भविष्य के संदर्भ के लिए जो इंटरनेट पर खोज करने के लिए दो दिन खर्च नहीं करना चाहता, जब आप क्यूआर कोड में बाइट एरे को एन्कोड करते हैं, तो आपको ISO-8859-1 वर्ण सेट का उपयोग करना होगा, UTF-8 नहीं।

+2

सत्य नहीं है - कृपया यूटीएफ -8 वाईआई जेक्सिंग क्रेनकोडर के बारे में संलग्न वर्किंग कोड के साथ मेरा जवाब देखें, और आईफोन से कोशिश की गई प्रत्येक डिकोडर ने – Shaybc

+10

काम किया है, यह वास्तव में एक अच्छा जवाब है। क्यूआर कोड स्पेक आईएसओ -885 9 -1 के अलावा कुछ भी अनुमति नहीं देता है। कभी-कभी यूटीएफ -8 का अनुमान लगाने के लिए डीकोडर्स होता है, लेकिन हमेशा इसे सही नहीं मिल सकता है। –

+1

यह सच है। जबकि मैं "यूटीएफ -8" का उपयोग कर रहा था, मेरा आवेदन एंड्रॉइड और आईफोन के कुछ सैनर पर काम कर रहा था लेकिन सभी नहीं। जब मैंने इस एन्कोडिंग को "आईएसओ -885 9 -1" में बदल दिया, तो सभी स्कैनर/डिकोडर्स एन्कोडेड क्यूआर छवि को स्कैन करने में सक्षम थे। – Khushboo

1

यदि आपको वास्तव में यूटीएफ -8 को एन्कोड करने की आवश्यकता है, तो आप यूनिकोड बाइट ऑर्डर मार्क को प्रीपेड करने का प्रयास कर सकते हैं। मुझे नहीं पता कि कैसे बड़े पैमाने पर इस विधि के लिए समर्थन है, लेकिन ZXing कम से कम इसे समर्थन करने के लिए प्रकट होता है: http://code.google.com/p/zxing/issues/detail?id=103

मैं हाल ही में क्यूआर मोड पर पढ़ रहा है, और मुझे लगता है कि मैं एक ही देखा है अभ्यास कहीं और उल्लेख किया गया है, लेकिन मैं सबसे ज्यादा नहीं है।

0

मैंने पहले जवाब में आईएसओ -885 9 -1 का उपयोग करने की कोशिश की। सभी एन्कोडिंग पर ठीक हो गए, लेकिन जब मैंने बाइट [] को डीकोडिंग पर परिणाम स्ट्रिंग का उपयोग करने की कोशिश की, तो सभी नकारात्मक बाइट्स चरित्र 63 (प्रश्न चिह्न) बन गए। निम्नलिखित कोड काम नहीं करता:

// Encoding works great 
byte[] contents = new byte[]{-1}; 
QRCodeWriter codeWriter = new QRCodeWriter(); 
BitMatrix bitMatrix = codeWriter.encode(new String(contents, Charset.forName("ISO-8859-1")), BarcodeFormat.QR_CODE, w, h); 

// Decodes like this fails 
LuminanceSource ls = new BufferedImageLuminanceSource(encodedBufferedImage); 
Result result = new QRCodeReader().decode(new BinaryBitmap(new HybridBinarizer(ls))); 
byte[] resultBytes = result.getText().getBytes(Charset.forName("ISO-8859-1")); // a byte[] with byte 63 is given 
return resultBytes; 

यह बहुत अजीब लग रहा है क्योंकि एक बहुत ही पुराने संस्करण में एपीआई (वास्तव में पता नहीं है) था एक विधि थार में अच्छी तरह से काम करता है:

Vector byteSegments = result.getByteSegments(); 

तो मैं करने की कोशिश की यह पता लगाने के लिए कि इस विधि को क्यों हटाया गया था और महसूस किया गया था कि मेटाडेटा के माध्यम से बाइटसेमेंट्स प्राप्त करने का कोई तरीका है। तो मेरी डिकोड विधि लगता है:

// Decodes like this works perfectly 
LuminanceSource ls = new BufferedImageLuminanceSource(encodedBufferedImage); 
Result result = new QRCodeReader().decode(new BinaryBitmap(new HybridBinarizer(ls))); 
Vector byteSegments = (Vector) result.getResultMetadata().get(ResultMetadataType.BYTE_SEGMENTS); 
int i = 0; 
int tam = 0; 
for (Object o : byteSegments) { 
    byte[] bs = (byte[])o; 
    tam += bs.length; 
} 
byte[] resultBytes = new byte[tam]; 
i = 0; 
for (Object o : byteSegments) { 
    byte[] bs = (byte[])o; 
    for (byte b : bs) { 
     resultBytes[i++] = b; 
    } 
} 
return resultBytes; 
18

यह मेरा काम कर उदाहरण जावा कोड UTF-8 एन्कोडिंग के साथ ZXing का उपयोग कर QR कोड एन्कोड करने के लिए, कृपया ध्यान दें है: यदि आप अपने पथ के लिए पथ और UTF8 डेटा को बदलने की आवश्यकता होगी और भाषा पात्रों

package com.mypackage.qr; 

import java.io.File; 
import java.io.IOException; 
import java.io.UnsupportedEncodingException; 
import java.nio.ByteBuffer; 
import java.nio.CharBuffer; 
import java.nio.charset.CharacterCodingException; 
import java.nio.charset.Charset; 
import java.nio.charset.CharsetEncoder; 
import java.util.Hashtable; 

import com.google.zxing.EncodeHintType; 
import com.google.zxing.MultiFormatWriter; 
import com.google.zxing.client.j2se.MatrixToImageWriter; 
import com.google.zxing.common.*; 

public class CreateQR { 

public static void main(String[] args) 
{ 
    Charset charset = Charset.forName("UTF-8"); 
    CharsetEncoder encoder = charset.newEncoder(); 
    byte[] b = null; 
    try { 
     // Convert a string to UTF-8 bytes in a ByteBuffer 
     ByteBuffer bbuf = encoder.encode(CharBuffer.wrap("utf 8 characters - i used hebrew, but you should write some of your own language characters")); 
     b = bbuf.array(); 
    } catch (CharacterCodingException e) { 
     System.out.println(e.getMessage()); 
    } 

    String data; 
    try { 
     data = new String(b, "UTF-8"); 
     // get a byte matrix for the data 
     BitMatrix matrix = null; 
     int h = 100; 
     int w = 100; 
     com.google.zxing.Writer writer = new MultiFormatWriter(); 
     try { 
      Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>(2); 
      hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); 
      matrix = writer.encode(data, 
      com.google.zxing.BarcodeFormat.QR_CODE, w, h, hints); 
     } catch (com.google.zxing.WriterException e) { 
      System.out.println(e.getMessage()); 
     } 

     // change this path to match yours (this is my mac home folder, you can use: c:\\qr_png.png if you are on windows) 
       String filePath = "/Users/shaybc/Desktop/OutlookQR/qr_png.png"; 
     File file = new File(filePath); 
     try { 
      MatrixToImageWriter.writeToFile(matrix, "PNG", file); 
      System.out.println("printing to " + file.getAbsolutePath()); 
     } catch (IOException e) { 
      System.out.println(e.getMessage()); 
     } 
    } catch (UnsupportedEncodingException e) { 
     System.out.println(e.getMessage()); 
    } 
} 

} 
+0

कोड का यह टुकड़ा मेरे अंत में भी काम कर रहा है। हालांकि, मेरा कोड बिल्कुल वही नहीं है। मैं एन्कोड() द्वारा लौटाई गई छवि को सहेज नहीं रहा हूं। हालांकि, मैं बिटमैट्रिक्स को बिटमैप उदाहरण में परिवर्तित कर रहा हूं। – Khushboo

+2

शैबैक, आपकी एन्कोडेड क्यूआर छवि एंड्रॉइड या आईफोन के कुछ ऐप्स द्वारा स्कैन करने योग्य हो सकती है लेकिन सभी नहीं। सफल QR छवि एन्कोडिंग के लिए आपको "यूटीएफ -8" के बजाय "आईएसओ -885 9 -1" का उपयोग करने की आवश्यकता है। आप Google Play से लाल लेजर ऐप या क्यूआर Droid ऐप का उपयोग कर अपने एन्कोडेड क्यूआर छवि का परीक्षण कर सकते हैं। – Khushboo

+2

बस लाल लेजर और क्यूआर Droid दोनों की जांच की और दोनों यूटीएफ 8 एन्कोडेड डेटा पढ़ने में सफल रहे – GetUsername

5

क्या इसके लायक है के लिए, मेरे ग्रूवी कील दोनों UTF-8 और ISO-8859-1 वर्ण एन्कोडिंग के साथ काम करने लगता है। सुनिश्चित नहीं है कि क्या होगा जब एक गैर zxing डिकोडर यूटीएफ -8 एन्कोडेड छवि को डीकोड करने की कोशिश करता है ... शायद डिवाइस के आधार पर भिन्न होता है।

// ------------------------------------------------------------------------------------ 
// Requires: groovy-1.7.6, jdk1.6.0_03, ./lib with zxing core-1.7.jar, javase-1.7.jar 
// Javadocs: http://zxing.org/w/docs/javadoc/overview-summary.html 
// Run with: groovy -cp "./lib/*" zxing.groovy 
// ------------------------------------------------------------------------------------ 

import com.google.zxing.* 
import com.google.zxing.common.* 
import com.google.zxing.client.j2se.* 

import java.awt.image.BufferedImage 
import javax.imageio.ImageIO 

def class zxing { 
    def static main(def args) { 
     def filename = "./qrcode.png" 
     def data = "This is a test to see if I can encode and decode this data..." 
     def charset = "UTF-8" //"ISO-8859-1" 
     def hints = new Hashtable<EncodeHintType, String>([(EncodeHintType.CHARACTER_SET): charset]) 

     writeQrCode(filename, data, charset, hints, 100, 100) 

     assert data == readQrCode(filename, charset, hints) 
    } 

    def static writeQrCode(def filename, def data, def charset, def hints, def width, def height) { 
     BitMatrix matrix = new MultiFormatWriter().encode(new String(data.getBytes(charset), charset), BarcodeFormat.QR_CODE, width, height, hints) 
     MatrixToImageWriter.writeToFile(matrix, filename.substring(filename.lastIndexOf('.')+1), new File(filename)) 
    } 

    def static readQrCode(def filename, def charset, def hints) { 
     BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(ImageIO.read(new FileInputStream(filename))))) 
     Result result = new MultiFormatReader().decode(binaryBitmap, hints) 

     result.getText()   
    } 

} 
1

शायद QRGen, जो ZXing के ऊपर एक बने और वाक्य रचना इस तरह से UTF-8 का समर्थन करता है पर देख रहे हैं लायक: कैमरे से

// if using special characters don't forget to supply the encoding 
VCard johnSpecial = new VCard("Jöhn Dɵe") 
         .setAdress("ëåäöƞ Sträät 1, 1234 Döestüwn"); 
QRCode.from(johnSpecial).withCharset("UTF-8").file();