Italian [RISOLTO] Generare Barcode script java

Xfood

Expert
Licensed User
Buona Domenica a Tutti,
stavo utilizzando questo codice preso da b4x ( ma non ricordo esattamente dove)
tutto funziona come dovrebbe, crea una bitmap cosi:
1756664054564.png

io vorrei che generasse la bitmap anche con il codice sotto, magari anche tramite parametro tipo cosi:

1756664183871.png


allego il codice java, si potrebbe modificare? Grazie mille

B4X:
Private ImgEan As ImageView
Dim bm As Bitmap
Dim codice as string="8017760987456"
bm = drawEAN13(codice)
ImgEan.Bitmap=bm
        
Sub drawEAN13 (data As String) As Bitmap
    Log("data: " & data)
    Return nativeMe.RunMethod("drawEAN13", Array(data))
    
End Sub


#If Java

import android.graphics.Bitmap;
import android.graphics.Point;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.content.Context;

import java.util.Collection;
import java.util.EnumMap;
import java.util.HashSet;
import java.util.Map;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;

public Bitmap drawEAN13 (String data) {
        Bitmap bitmap = encodeAsBitmap(data, 250, 100);
        return bitmap;
}

public Bitmap encodeAsBitmap(String text, int width, int height){

    text = Ean13CheckSum(text);
    MultiFormatWriter writer = new MultiFormatWriter();
    BitMatrix matrix = null;
    try {
        matrix = writer.encode(text, BarcodeFormat.EAN_13, width, height);
    } catch (WriterException ex) {
        ex.printStackTrace();
    }
    Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
    for (int x = 0; x < width; x++){
        for (int y = 0; y < height; y++){
            bmp.setPixel(x, y, matrix.get(x,y) ? 0xff000000 : 0xffffffff);
        }
    }
    return bmp;
}

// checksum utility
public String Ean13CheckSum(String Str) {
    int DigitValue = 0; int CodeLen = Str.length();
    int CodeValue[] = new int[CodeLen];
    if(CodeLen < 13) {
       for(int c = 0; c < CodeLen; c ++) {
         CodeValue[c] = Integer.parseInt(Str.substring(c,c+1));
       }
       int Even = CodeValue[0] + CodeValue[2] + CodeValue[4] + CodeValue[6] + CodeValue[8] + CodeValue[10];
       int Odd = (CodeValue[1] + CodeValue[3] + CodeValue[5] + CodeValue[7] + CodeValue[9] + CodeValue[11]) * 3;
       int Sum = Odd + Even;
       DigitValue = 10 - (Sum % 10);
       DigitValue = (DigitValue == 10) ? 0 : DigitValue;
    }
    Str = Str + DigitValue;
    return Str;
}


#End If
 

Sagenut

Expert
Licensed User
Longtime User
Velocemente ti direi di provare a:
- mettere la imageview dentro un panel
- mettere una label sulla imageview sempre dentro al panel
- scrivi il codice nella label
- fai un panel.Snapshot per avere l'immagine del codice a barre con anche il numero.
 

Xfood

Expert
Licensed User
risolto con il codice java, con l'aiuto di gemini
ecco il risultato:
1756665848184.png


1756665867602.png


allego il codice
sia per ean 8 che per ean 13

B4X:
ean 8:
Sub drawEAN8 (data As String) As Bitmap
    
    Return nativeMe.RunMethod("drawEAN8", Array(data))
    
End Sub

#If Java
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.content.Context;

import java.util.Collection;
import java.util.EnumMap;
import java.util.HashSet;
import java.util.Map;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;

public Bitmap drawEAN8 (String data) {
    Bitmap bitmap = encodeAsBitmap(data, 200, 100);
    return bitmap;
}

public Bitmap encodeAsBitmap(String text, int width, int height){

    text = Ean8CheckSum(text);
    MultiFormatWriter writer = new MultiFormatWriter();
    BitMatrix matrix = null;
    try {
       matrix = writer.encode(text, BarcodeFormat.EAN_8, width, height);
    } catch (WriterException ex) {
        ex.printStackTrace();
        return null; // Aggiunto per gestire il caso di errore
    }

    // --- Righe da aggiungere ---
    final int TEXT_HEIGHT_MARGIN = 40;
    final int TEXT_SIZE = 24;
    final int TEXT_PADDING = 5;

    int finalHeight = height + TEXT_PADDING + TEXT_HEIGHT_MARGIN;
    Bitmap finalBmp = Bitmap.createBitmap(width, finalHeight, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(finalBmp);
    canvas.drawColor(Color.WHITE);
    // --- Fine righe da aggiungere ---
    
    // Righe esistenti per disegnare il barcode
    for (int x = 0; x < width; x++){
        for (int y = 0; y < height; y++){
            finalBmp.setPixel(x, y, matrix.get(x,y) ? 0xff000000 : 0xffffffff);
        }
    }
    
    // --- Righe da aggiungere per il testo ---
    Paint paint = new Paint();
    paint.setColor(Color.BLACK);
    paint.setTextSize(TEXT_SIZE);
    paint.setTextAlign(Paint.Align.CENTER);

    float xPos = width / 2f;
    float yPos = height + TEXT_PADDING + (TEXT_HEIGHT_MARGIN / 2f) + (TEXT_SIZE / 2f);
    canvas.drawText(text, xPos, yPos, paint);
    
    return finalBmp;
    // --- Fine righe da aggiungere ---
}

// checksum utility
public String Ean8CheckSum(String Str) {
    int DigitValue = 0; int CodeLen = Str.length();
    int CodeValue[] = new int[CodeLen];
    if(CodeLen < 8) {
        for(int c = 0; c < CodeLen; c ++) {
          CodeValue[c] = Integer.parseInt(Str.substring(c,c+1));
        }
        int Odd = (CodeValue[0] + CodeValue[2] + CodeValue[4] + CodeValue[6]) * 3;
        int Even = CodeValue[1] + CodeValue[3] + CodeValue[5];
        DigitValue = ( 10 - ((Odd + Even) % 10) ) % 10;
        DigitValue = (DigitValue == 10) ? 0 : DigitValue ;
    }
    Str = Str + DigitValue;
    return Str;       
}
#End If



ean 13:

Sub drawEAN13 (data As String) As Bitmap
    
    Return nativeMe.RunMethod("drawEAN13", Array(data))
    
End Sub



#If Java
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.content.Context;

import java.util.Collection;
import java.util.EnumMap;
import java.util.HashSet;
import java.util.Map;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;

public Bitmap drawEAN13 (String data) {
    Bitmap bitmap = encodeAsBitmap(data, 250, 100);
    return bitmap;
}

public Bitmap encodeAsBitmap(String text, int width, int height){

    text = Ean13CheckSum(text);
    MultiFormatWriter writer = new MultiFormatWriter();
    BitMatrix matrix = null;
    try {
        matrix = writer.encode(text, BarcodeFormat.EAN_13, width, height);
    } catch (WriterException ex) {
        ex.printStackTrace();
        return null; // Aggiunto per gestire il caso di errore
    }

    // --- Righe da aggiungere ---
    final int TEXT_HEIGHT_MARGIN = 40;
    final int TEXT_SIZE = 24;
    final int TEXT_PADDING = 5;

    int finalHeight = height + TEXT_PADDING + TEXT_HEIGHT_MARGIN;
    Bitmap finalBmp = Bitmap.createBitmap(width, finalHeight, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(finalBmp);
    canvas.drawColor(Color.WHITE);
    // --- Fine righe da aggiungere ---
    
    // Righe esistenti per disegnare il barcode
    for (int x = 0; x < width; x++){
        for (int y = 0; y < height; y++){
            finalBmp.setPixel(x, y, matrix.get(x,y) ? 0xff000000 : 0xffffffff);
        }
    }
    
    // --- Righe da aggiungere per il testo ---
    Paint paint = new Paint();
    paint.setColor(Color.BLACK);
    paint.setTextSize(TEXT_SIZE);
    paint.setTextAlign(Paint.Align.CENTER);

    float xPos = width / 2f;
    float yPos = height + TEXT_PADDING + (TEXT_HEIGHT_MARGIN / 2f) + (TEXT_SIZE / 2f);
    canvas.drawText(text, xPos, yPos, paint);
    
    return finalBmp;
    // --- Fine righe da aggiungere ---
}

// checksum utility
public String Ean13CheckSum(String Str) {
    int DigitValue = 0; int CodeLen = Str.length();
    int CodeValue[] = new int[CodeLen];
    if(CodeLen < 13) {
        for(int c = 0; c < CodeLen; c ++) {
            CodeValue[c] = Integer.parseInt(Str.substring(c,c+1));
        }
        int Even = CodeValue[0] + CodeValue[2] + CodeValue[4] + CodeValue[6] + CodeValue[8] + CodeValue[10];
        int Odd = (CodeValue[1] + CodeValue[3] + CodeValue[5] + CodeValue[7] + CodeValue[9] + CodeValue[11]) * 3;
        int Sum = Odd + Even;
        DigitValue = 10 - (Sum % 10);
        DigitValue = (DigitValue == 10) ? 0 : DigitValue;
    }
    Str = Str + DigitValue;
    return Str;
}
#End If
 

TILogistic

Expert
Licensed User
Longtime User
Barcodes only using B4X code (cross-platform), without external libraries.
Generate a bitmap that you can save.

Options:
BackGroundColor
Padding
BarWith
BarHeight
BarColor
TextSize
TextColor

EXAMPLES of some codes, with default options.
EAN-13

1756676792162.png

EAN-8
1756676846769.png

UPC-A
1756676902130.png

CODE-39
1756676959748.png

CODE-128 (Mode A,B o C)
1756677036885.png

CODE-93
1756677105268.png


With options:
B4X:
    Dim EAN13 As EAN13Barcode
    EAN13.Initialize
    EAN13.BackGroundColor = xui.Color_Yellow
    EAN13.BarColor = xui.Color_Blue
    EAN13.TextColor = xui.Color_Red
    B4XImageView1.Bitmap = EAN13.DrawBarcode("978020137962")
1756677605050.png
 

Xfood

Expert
Licensed User
Barcodes only using B4X code (cross-platform), without external libraries.
Generate a bitmap that you can save.

Options:
BackGroundColor
Padding
BarWith
BarHeight
BarColor
TextSize
TextColor

EXAMPLES of some codes, with default options.
EAN-13

View attachment 166488
EAN-8
View attachment 166490
UPC-A
View attachment 166491
CODE-39
View attachment 166492
CODE-128 (Mode A,B o C)
View attachment 166493
CODE-93
View attachment 166494

With options:
B4X:
    Dim EAN13 As EAN13Barcode
    EAN13.Initialize
    EAN13.BackGroundColor = xui.Color_Yellow
    EAN13.BarColor = xui.Color_Blue
    EAN13.TextColor = xui.Color_Red
    B4XImageView1.Bitmap = EAN13.DrawBarcode("978020137962")
View attachment 166495
Condividi il sorgente?
 

TILogistic

Expert
Licensed User
Longtime User
In che senso?
Più di un semplice design:
Progettato per soddisfare standard quali convalida (checksum, cifre, modalità), barre di sicurezza, testo e altro ancora.


Vedere l'esempio EAN-13, verificare e aggiungere la cifra di controllo, le posizioni del testo e le barre di guardia.
Ne ho parlato nel post che hai pubblicato.
1756709811514.png

il mio commento.
 
Last edited:

Xfood

Expert
Licensed User
Più di un semplice design:
Progettato per soddisfare standard quali convalida (checksum, cifre, modalità), barre di sicurezza, testo e altro ancora.


Vedere l'esempio EAN-13, verificare e aggiungere la cifra di controllo, le posizioni del testo e le barre di guardia.
Ne ho parlato nel post che hai pubblicato.
View attachment 166497

il mio commento.
Sarebbe bello avere questa libreria completa.
 
Top