求助!Android 条码(一维码)生成

LoadTown 2015-03-17 05:01:44
如题: 现在普遍流行二维码,但是条码项目中也需要用到,现在遇到一疑惑:

网上搜索Android 生成一维,代码都是如出一辙相互拷贝,测试也可以生成一维码但是和标准的(以微信/支付宝为基准)一维码生成的图片貌似有差异对比如下:

测试使用纯18位数字生成


【图1 是使用如下算法生成的一维码,也是网上广为流传的算法】
 public static Bitmap toBitmap(BitMatrix byteMatrix)    
{
// 定义位图的宽和高
int width = byteMatrix.getWidth();
int height = byteMatrix.getHeight();
int[] pixels = new int[width * height];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
if (byteMatrix.get(x, y)) {
pixels[y * width + x] = 0xff000000;
}
}
}
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
// 通过像素数组生成bitmap,具体参考api
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;
}


/*********************************************************************/

【图2 是使用一个叫“Barcode Generator” 的软件生成的 】

相比之下 图一生成的条码 竖线 要比图2(37条黑色竖线)多的多,在网上我使用在线生成条码也是生成37条黑色竖线,查看支付宝微信生成的条码也是37条竖线,所以图一生成的算法我觉得不妥,还请大神指导 生成图二的条码算法 不胜感激谢谢!
...全文
827 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zq_Hero 2016-03-28
  • 打赏
  • 举报
回复
求问楼主 还有编译后的cor包吗?问题解决了?能给给发个例子不能?core包是怎么重新编译的?,。。。。万谢万谢.... zhaoq_hero@163.com
windfury_plus 2015-03-18
  • 打赏
  • 举报
回复
引用 7 楼 zcmain 的回复:
有谁做过的帮忙一下
用了下Zxing的,表示没任何问题,37条…… 附上测试代码:

public class MainActivity extends Activity {
	ImageView im;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_main);
        
    }
    
    @Override
    protected void onResume() {
    	super.onResume();
    	im=(ImageView)findViewById(R.id.imageView1);
    	im.setImageBitmap(getBarcode("123654789632145874",300,300));
    }
    
    private static final String CODE = "utf-8";  
    
    public static Bitmap  getBarcode(String str, Integer width,  
            Integer height)  
    {  

        if (width == null || width < 200)  
        {  
            width = 200;  
        }  

        if (height == null || height < 50)  
        {  
            height = 50;  
        }  

        try  
        {  
            // 文字编码  
            Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();  
            hints.put(EncodeHintType.CHARACTER_SET, CODE);  

            BitMatrix bitMatrix = new MultiFormatWriter().encode(str,  
                    BarcodeFormat.CODE_128, width, height, hints);  
            
            return BitMatrixToBitmap(bitMatrix);  
        }  
        catch (Exception e)  
        {  
            e.printStackTrace();  
        }  
        return null;  
    }  
    
    /** 
     * BitMatrix转换成Bitmap 
     * @param matrix 
     * @return 
     */  
    private static Bitmap BitMatrixToBitmap(BitMatrix matrix) {  
        final int WHITE = 0xFFFFFFFF;  
        final int BLACK = 0xFF000000;  

        int width = matrix.getWidth();  
        int height = matrix.getHeight();  
        int[] pixels = new int[width * height];  
        for (int y = 0; y < height; y++) {  
            int offset = y * width;  
            for (int x = 0; x < width; x++) {  
                pixels[offset + x] = matrix.get(x, y) ? BLACK : WHITE;  
            }  
        }  
        return createBitmap(width, height, pixels);  
    }
    
    /** 
     * 生成Bitmap 
     * @param width 
     * @param height 
     * @param pixels 
     * @return 
     */  
    private static Bitmap createBitmap(int width, int height, int[] pixels) {  
        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);  
        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);  
        return bitmap;  
    }  
    
}
LoadTown 2015-03-18
  • 打赏
  • 举报
回复
有谁做过的帮忙一下
LoadTown 2015-03-18
  • 打赏
  • 举报
回复
继续顶 不要沉 求帮助
LoadTown 2015-03-18
  • 打赏
  • 举报
回复
引用 4 楼 inquisitive_plus 的回复:
是基于Zxing的吧?
图一是基于 Zxing 的生成的条码密度好大 图二我反编译了一下发现里面没有使用到Zxing架包以下是 部分源码可能是这个方法生成的 但是被混淆了 看不明白,还请高人指点一下。谢谢~~
public static Bitmap a(String paramString, com.a.a.a parama, int paramInt1, int paramInt2, int paramInt3)
  {
    Log.d(a, "getBitmap(" + paramString + ", " + paramInt1 + ") BEGIN");
    int i1;
    try
    {
      e locale = new e();
      Hashtable localHashtable = new Hashtable();
      localHashtable.put(c.b, "UTF-8");
      b localb = locale.a(paramString, parama, paramInt2, paramInt1, localHashtable);
      int i = localb.b();
      int j = localb.c();
      Object localObject2 = Bitmap.createBitmap(i, j, Bitmap.Config.ARGB_4444);
      int k = 0;
      if (k >= i)
      {
        if (com.a.a.a.f == parama)
        {
          Bitmap localBitmap = Bitmap.createScaledBitmap((Bitmap)localObject2, paramInt2, paramInt1, false);
          localObject2 = localBitmap;
        }
        return localObject2;
      }
      for (int l = 0; ; ++l)
      {
        if (l >= j)
          ++k;
        if (!localb.a(k, l))
          break;
        i1 = -16777216;
        ((Bitmap)localObject2).setPixel(k, l, i1);
      }
    }
    catch (Exception localException)
    {
    }
    finally
    {
      Log.d(a, "getBitmap END");
    }
  }
LoadTown 2015-03-18
  • 打赏
  • 举报
回复
引用 10 楼 inquisitive_plus 的回复:
jar包,前不久从github下载源码弄的 http://download.csdn.net/detail/inquisitive_plus/8441063 例子已经发送了
多谢楼主,使用源生的Zxing导致这个问题,现在改用编译后的core之后问题解决。再次感谢!
windfury_plus 2015-03-18
  • 打赏
  • 举报
回复
jar包,前不久从github下载源码弄的 http://download.csdn.net/detail/inquisitive_plus/8441063 例子已经发送了
LoadTown 2015-03-18
  • 打赏
  • 举报
回复
引用 8 楼 inquisitive_plus 的回复:
[quote=引用 7 楼 zcmain 的回复:]
有谁做过的帮忙一下

用了下Zxing的,表示没任何问题,37条……
附上测试代码:

public class MainActivity extends Activity {
ImageView im;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);

}

@Override
protected void onResume() {
super.onResume();
im=(ImageView)findViewById(R.id.imageView1);
im.setImageBitmap(getBarcode("123654789632145874",300,300));
}

private static final String CODE = "utf-8";

public static Bitmap getBarcode(String str, Integer width,
Integer height)
{

if (width == null || width < 200)
{
width = 200;
}

if (height == null || height < 50)
{
height = 50;
}

try
{
// 文字编码
Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
hints.put(EncodeHintType.CHARACTER_SET, CODE);

BitMatrix bitMatrix = new MultiFormatWriter().encode(str,
BarcodeFormat.CODE_128, width, height, hints);

return BitMatrixToBitmap(bitMatrix);
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}

/**
* BitMatrix转换成Bitmap
* @param matrix
* @return
*/
private static Bitmap BitMatrixToBitmap(BitMatrix matrix) {
final int WHITE = 0xFFFFFFFF;
final int BLACK = 0xFF000000;

int width = matrix.getWidth();
int height = matrix.getHeight();
int[] pixels = new int[width * height];
for (int y = 0; y < height; y++) {
int offset = y * width;
for (int x = 0; x < width; x++) {
pixels[offset + x] = matrix.get(x, y) ? BLACK : WHITE;
}
}
return createBitmap(width, height, pixels);
}

/**
* 生成Bitmap
* @param width
* @param height
* @param pixels
* @return
*/
private static Bitmap createBitmap(int width, int height, int[] pixels) {
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;
}

}
[/quote]
嗨 哥们我用了你这段代码但是生成图片如下,并不是 37条纹理:


难道是我的 ZXing架包问题?能否把你测试代码发我一份 874653917@qq.com 感谢!
windfury_plus 2015-03-17
  • 打赏
  • 举报
回复
是基于Zxing的吧?
LoadTown 2015-03-17
  • 打赏
  • 举报
回复
引用 2 楼 ylchenjian 的回复:
生成方式就没了,只是说一维码有多种格式upc-a / ean-13/ean-8等 ,也即是说图1跟图2对于扫描软件来说都会自动匹配。建议你自己百科一下一维码,找一个适合自己的编码,然后再百度下相关代码
嗯 不过图一图二 都是采用CODE_128编码格式,数据都是一样生成的文理却不一样很奇怪,我觉得还是算法问题!谢谢
ken哥 2015-03-17
  • 打赏
  • 举报
回复
生成方式就没了,只是说一维码有多种格式upc-a / ean-13/ean-8等 ,也即是说图1跟图2对于扫描软件来说都会自动匹配。建议你自己百科一下一维码,找一个适合自己的编码,然后再百度下相关代码
LoadTown 2015-03-17
  • 打赏
  • 举报
回复
自己先顶一个,有知道的大神帮忙一下或者提供思路!

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧