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.
 

Lucas Siqueira

Active Member
Licensed User
Longtime User
 

LucaMs

Expert
Licensed User
Longtime User
😊
 
Top