精华内容
下载资源
问答
  • 今天来做一下这种功能,先生成商品海报图片,然后长按这张图片识别中二维码。先附上两张效果图: 这里面会用到二维码的生成与识别,使用的是google ZXing,要在app的build.gradle里面引入 dependencies {...

    购物商城里面的商品分享给朋友的时候会生成一张海报图片,图片上附带这二维码图片,朋友拿到这张图片扫描上面的二维码就可以进入商品详情页查看此商品了。今天来做一下这种功能,先生成商品海报图片,然后长按这张图片识别图中二维码。先附上两张效果图:

          

    这里面会用到二维码的生成与识别,使用的是google ZXing,要在app的build.gradle里面引入

    dependencies {
        compile 'com.google.zxing:core:3.3.0'//zxing二维码
    }

    图中还有一处现售价文字中间有一横线,此处是这样实现的

            //中间加横线
            tv_nowPrice.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
            //底部加横线:
            tv_nowPrice .getPaint().setFlags(Paint. UNDERLINE_TEXT_FLAG );

    首先来说下海报图片的生成,海报样式根据UI新建个布局文件,这里以我做的例子为例来说:

    新建一个generateposter.xml布局文件,效果图和布局代码如下

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <ImageView
            android:id="@+id/img_good"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="3"
            android:src="@mipmap/pic_share"
            android:scaleType="fitXY"/>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="2"
            android:orientation="horizontal">
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="2"
                android:orientation="vertical">
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="5dp"
                    android:layout_marginRight="10dp"
                    android:layout_marginTop="15dp"
                    android:text="包邮  卤料包卤料卤菜四川味100g×4卤味调料秘制包配方五香鸭脖自家卤水"
                    android:textSize="16dp"
                    android:textColor="@color/edittext_color"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="5dp"
                    android:layout_marginTop="10dp"
                    android:text="券:15"
                    android:textSize="16dp"
                    android:textColor="@color/colorAccent"/>
                <TextView
                    android:id="@+id/tv_nowPrice"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="5dp"
                    android:layout_marginTop="10dp"
                    android:text="现售价  ¥29.8"
                    android:textSize="16dp"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="5dp"
                    android:layout_marginTop="10dp"
                    android:text="券后价  ¥14.8"
                    android:textSize="16dp"
                    android:textColor="@color/colorAccent"/>
            </LinearLayout>
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:orientation="vertical">
                <ImageView
                    android:id="@+id/img_erweima"
                    android:layout_width="90dp"
                    android:layout_height="90dp"
                    android:layout_marginTop="15dp"
                    android:scaleType="fitXY"
                    android:layout_gravity="center_horizontal"/>
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="center"
                    android:layout_marginTop="10dp"
                    android:text="长按扫码购买商品"
                    android:textSize="16dp"
                    android:textColor="@color/edittext_color"/>
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>

    把布局文件view转换成图片

        //然后View和其内部的子View都具有了实际大小,也就是完成了布局,相当与添加到了界面上。接着就可以创建位图并在上面绘制了:
        public static void layoutView(View v, int width, int height) {
            // 整个View的大小 参数是左上角 和右下角的坐标
            v.layout(0, 0, width, height);
            int measuredWidth = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);
            int measuredHeight = View.MeasureSpec.makeMeasureSpec(10000, View.MeasureSpec.AT_MOST);
            /** 当然,measure完后,并不会实际改变View的尺寸,需要调用View.layout方法去进行布局。
             * 按示例调用layout函数后,View的大小将会变成你想要设置成的大小。
             */
            v.measure(measuredWidth, measuredHeight);
            v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
        }
    
       /**
         * 把一个View转换成图片
         * @param v
         * @return
         */
        public static Bitmap loadBitmapFromView(View v) {
            int w = v.getWidth();
            int h = v.getHeight();
            Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
            Canvas c = new Canvas(bmp);
    
            /** 如果不设置canvas画布为白色,则生成透明 */
            c.drawColor(Color.WHITE);
    
            v.layout(0, 0, w, h);
            v.draw(c);
    
            return bmp;
        }

    二维码生成

    /**
         * 生成二维码 要转换的地址或字符串,可以是中文
         *
         * @param url
         * @param width
         * @param height
         * @return
         */
        public static Bitmap createQRImage(String url, int width, int height, boolean needDeleteWhiteBorder) {
            try {
                // 判断URL合法性
                if (url == null || "".equals(url) || url.length() < 1) {
                    return null;
                }
                Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
                hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
                // 图像数据转换,使用了矩阵转换
                BitMatrix bitMatrix = new QRCodeWriter().encode(url, BarcodeFormat.QR_CODE, width, height, hints);
                if (needDeleteWhiteBorder) {
                    bitMatrix = deleteWhite(bitMatrix);//删除白边
                }
                width = bitMatrix.getWidth();
                height = bitMatrix.getHeight();
                int[] pixels = new int[width * height];
                // 下面这里按照二维码的算法,逐个生成二维码的图片,
                // 两个for循环是图片横列扫描的结果
                for (int y = 0; y < height; y++) {
                    for (int x = 0; x < width; x++) {
                        if (bitMatrix.get(x, y)) {
                            pixels[y * width + x] = 0xff000000;
                        } else {
                            pixels[y * width + x] = 0xffffffff;
                        }
                    }
                }
                // 生成二维码图片的格式,使用ARGB_8888
                Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
                bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
                return bitmap;
            } catch (WriterException e) {
                e.printStackTrace();
            }
            return null;
        }

    二维码的识别

       /**
         * 识别图中是否有二维码
         * @param bitmap
         * @return
         */
        public static Result handleQRCodeFormBitmap(Bitmap bitmap) {
            Map<DecodeHintType, Object> hints = new EnumMap<>(DecodeHintType.class);
            hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
            hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
            hints.put(DecodeHintType.POSSIBLE_FORMATS, BarcodeFormat.QR_CODE);
    
            int width = bitmap.getWidth();
            int height = bitmap.getHeight();
            int[] data = new int[width * height];
            bitmap.getPixels(data, 0, width, 0, 0, width, height);
            RGBLuminanceSource source = new RGBLuminanceSource(width, height, data);
            BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));
            QRCodeReader reader2 = new QRCodeReader();
            Result result = null;
            try {
                result = reader2.decode(bitmap1, hints);
                Log.e("tag","result="+result.getText());
            } catch (Exception e) {
                e.printStackTrace();
                if (source != null) {
                    BinaryBitmap bitmap2 = new BinaryBitmap(new GlobalHistogramBinarizer(source));
                    try {
                        result = reader2.decode(bitmap2, hints);
                    } catch (Exception e1) {
                        e1.printStackTrace();
                    }
                }
            }
            return result;
        }

    如果图片上有二维码,长按图片弹窗显示识别图中二维码,如果图片上没有二维码,长按图片弹窗中则不显示识别图中二维码,这里的处理逻辑为,先识别二维码,通过对识别的结果判断图中是否有二维码,如果有识别结果则证明图片上有二维码,如果没有识别结果或者识别结果为空,这表明图片上没有二维码;下面是两种情况的图片进行对比:

        

     代码如下:

    img_show.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    Bitmap obmp = ((BitmapDrawable) (img_show.getDrawable())).getBitmap();
                    Result result = handleQRCodeFormBitmap(obmp);
                    if (result == null) {
                        Log.e("tag", "图上无二维码");
                        showAlert(obmp);
                    } else {
                        Log.e("tag", "图中二维码识别结果=" + result.getText());
                        showSelectAlert(obmp,result.toString());
                    }
                    return false;
                }
            });
    
       /**
         * 图中无二维码显示此弹窗
         * @param bitmap
         */
        private void showAlert(final Bitmap bitmap) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("保存图片")
                    .setCancelable(false)
                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterfacem, int i) {
                            SaveImgToSD.saveMyBitmap("img_goods",bitmap);
                        }
                    })
                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterfacem, int i) {
                        }
                    });
            builder.show();
        }
    
        /**
         * 图中有二维码显示此弹窗
         * @param bitmap
         * @param url
         */
        private void showSelectAlert(final Bitmap bitmap, final String url) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("请选择");
            String str[] = {"保存图片", "识别图中二维码"};
            builder.setItems(str, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterfacem, int i) {
                    switch (i) {
                        case 0:
                            SaveImgToSD.saveMyBitmap("img_goods",bitmap);
                        break;
                        case 1:
                            //用默认浏览器打开扫描得到的地址
                            Intent intent = new Intent();
                            intent.setAction("android.intent.action.VIEW");
                            Uri content_url = Uri.parse(url);
                            intent.setData(content_url);
                            startActivity(intent);
                        break;
                    }
                }
            });
            builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterfacem, int i) {
    
                }
            });
            builder.show();
        }

    以上就实现的全部功能,下面附上整个工程的完整代码:

    有两个布局文件,一个是activity类的布局,另一个是生成海报图片的布局。

    activity类的布局文件activity_generateposter_null.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            style="@style/textview_title"
            android:text="生成海报" />
        <Button
            android:id="@+id/btn_generate"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_margin="20dp"
            android:text="生成海报"/>
        <ImageView
            android:id="@+id/img_show"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </LinearLayout>

    生成海报图片的布局文件activity_generateposter.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <ImageView
            android:id="@+id/img_good"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="3"
            android:src="@mipmap/pic_share"
            android:scaleType="fitXY"/>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="2"
            android:orientation="horizontal">
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="2"
                android:orientation="vertical">
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="5dp"
                    android:layout_marginRight="10dp"
                    android:layout_marginTop="15dp"
                    android:text="包邮  卤料包卤料卤菜四川味100g×4卤味调料秘制包配方五香鸭脖自家卤水"
                    android:textSize="16dp"
                    android:textColor="@color/edittext_color"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="5dp"
                    android:layout_marginTop="10dp"
                    android:text="券:15"
                    android:textSize="16dp"
                    android:textColor="@color/colorAccent"/>
                <TextView
                    android:id="@+id/tv_nowPrice"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="5dp"
                    android:layout_marginTop="10dp"
                    android:text="现售价  ¥29.8"
                    android:textSize="16dp"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="5dp"
                    android:layout_marginTop="10dp"
                    android:text="券后价  ¥14.8"
                    android:textSize="16dp"
                    android:textColor="@color/colorAccent"/>
            </LinearLayout>
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:orientation="vertical">
                <ImageView
                    android:id="@+id/img_erweima"
                    android:layout_width="90dp"
                    android:layout_height="90dp"
                    android:layout_marginTop="15dp"
                    android:scaleType="fitXY"
                    android:layout_gravity="center_horizontal"/>
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="center"
                    android:layout_marginTop="10dp"
                    android:text="长按扫码购买商品"
                    android:textSize="16dp"
                    android:textColor="@color/edittext_color"/>
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>

    activity类文件GeneratePosterActivity.class

    package com.junto.text.Posters;
    
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.graphics.Paint;
    import android.graphics.drawable.BitmapDrawable;
    import android.net.Uri;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import com.google.zxing.Result;
    import com.junto.text.R;
    import com.junto.text.tools.SaveImgToSD;
    import com.junto.text.tools.ZXingUtils;
    
    import static com.junto.text.Posters.ImageUtils.loadBitmapFromView;
    import static com.junto.text.tools.ZXingUtils.handleQRCodeFormBitmap;
    
    /**
     * Created by WangJinyong on 2019/10/23.
     * 生成海报
     */
    public class GeneratePosterActivity extends Activity {
    
        View view;
        ImageView img_show, img_erweima;
        Button btn_generate;
        TextView tv_nowPrice;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_generateposter_null);
            initView();
        }
    
        private void initView() {
            view = View.inflate(this, R.layout.activity_generateposter, null);
            img_show = findViewById(R.id.img_show);
            tv_nowPrice = view.findViewById(R.id.tv_nowPrice);//现售价
            //中间加横线
            tv_nowPrice.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
            //底部加横线:
    //        tv_nowPrice .getPaint().setFlags(Paint. UNDERLINE_TEXT_FLAG );
            img_erweima = view.findViewById(R.id.img_erweima);
            btn_generate = findViewById(R.id.btn_generate);
            btn_generate.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    img_erweima.setImageBitmap(ZXingUtils.createQRImage("http://www.taobao.com", 90, 90, true));
                    ImageUtils.layoutView(view, 840, 1200);
                    // 把一个View转换成图片
                    Bitmap cachebmp = loadBitmapFromView(view);
                    img_show.setImageBitmap(cachebmp);//直接展示转化的bitmap
    //                ImageUtils.viewSaveToImage(view,"GeneratePoster",img_show);
                }
            });
    
            img_show.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    Bitmap obmp = ((BitmapDrawable) (img_show.getDrawable())).getBitmap();
                    Result result = handleQRCodeFormBitmap(obmp);
                    if (result == null) {
                        Log.e("tag", "图上无二维码");
                        showAlert(obmp);
                    } else {
                        Log.e("tag", "图中二维码识别结果=" + result.getText());
                        showSelectAlert(obmp,result.toString());
                    }
                    return false;
                }
            });
        }
    
        /**
         * 图中无二维码显示此弹窗
         * @param bitmap
         */
        private void showAlert(final Bitmap bitmap) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("保存图片")
                    .setCancelable(false)
                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterfacem, int i) {
                            SaveImgToSD.saveMyBitmap("img_goods",bitmap);
                        }
                    })
                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterfacem, int i) {
                        }
                    });
            builder.show();
        }
    
        /**
         * 图中有二维码显示此弹窗
         * @param bitmap
         * @param url
         */
        private void showSelectAlert(final Bitmap bitmap, final String url) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("请选择");
            String str[] = {"保存图片", "识别图中二维码"};
            builder.setItems(str, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterfacem, int i) {
                    switch (i) {
                        case 0:
                            SaveImgToSD.saveMyBitmap("img_goods",bitmap);
                        break;
                        case 1:
                            //用默认浏览器打开扫描得到的地址
                            Intent intent = new Intent();
                            intent.setAction("android.intent.action.VIEW");
                            Uri content_url = Uri.parse(url);
                            intent.setData(content_url);
                            startActivity(intent);
                        break;
                    }
                }
            });
            builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterfacem, int i) {
    
                }
            });
            builder.show();
        }
    }

    用到的工具类:

    1.二维码的生成与识别工具ZXingUtils
    package com.junto.text.tools;
    
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.PointF;
    import android.util.Log;
    import android.view.Gravity;
    import android.view.View;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    
    import com.google.zxing.BarcodeFormat;
    import com.google.zxing.BinaryBitmap;
    import com.google.zxing.DecodeHintType;
    import com.google.zxing.EncodeHintType;
    import com.google.zxing.MultiFormatWriter;
    import com.google.zxing.RGBLuminanceSource;
    import com.google.zxing.Result;
    import com.google.zxing.WriterException;
    import com.google.zxing.common.BitMatrix;
    import com.google.zxing.common.GlobalHistogramBinarizer;
    import com.google.zxing.common.HybridBinarizer;
    import com.google.zxing.qrcode.QRCodeReader;
    import com.google.zxing.qrcode.QRCodeWriter;
    
    import java.util.EnumMap;
    import java.util.Hashtable;
    import java.util.Map;
    
    /**
     * 生成条形码和二维码的工具
     */
    public class ZXingUtils {
    
        /**
         * 生成二维码 要转换的地址或字符串,可以是中文
         *
         * @param url
         * @param width
         * @param height
         * @return
         */
        public static Bitmap createQRImage(String url, int width, int height, boolean needDeleteWhiteBorder) {
            try {
                // 判断URL合法性
                if (url == null || "".equals(url) || url.length() < 1) {
                    return null;
                }
                Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
                hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
                // 图像数据转换,使用了矩阵转换
                BitMatrix bitMatrix = new QRCodeWriter().encode(url, BarcodeFormat.QR_CODE, width, height, hints);
                if (needDeleteWhiteBorder) {
                    bitMatrix = deleteWhite(bitMatrix);//删除白边
                }
                width = bitMatrix.getWidth();
                height = bitMatrix.getHeight();
                int[] pixels = new int[width * height];
                // 下面这里按照二维码的算法,逐个生成二维码的图片,
                // 两个for循环是图片横列扫描的结果
                for (int y = 0; y < height; y++) {
                    for (int x = 0; x < width; x++) {
                        if (bitMatrix.get(x, y)) {
                            pixels[y * width + x] = 0xff000000;
                        } else {
                            pixels[y * width + x] = 0xffffffff;
                        }
                    }
                }
                // 生成二维码图片的格式,使用ARGB_8888
                Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
                bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
                return bitmap;
            } catch (WriterException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 生成的二维码  删除白边
         * @param matrix
         * @return
         */
        private static BitMatrix deleteWhite(BitMatrix matrix) {
            int[] rec = matrix.getEnclosingRectangle();
            int resWidth = rec[2] + 1;
            int resHeight = rec[3] + 1;
    
            BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
            resMatrix.clear();
            for (int i = 0; i < resWidth; i++) {
                for (int j = 0; j < resHeight; j++) {
                    if (matrix.get(i + rec[0], j + rec[1]))
                        resMatrix.set(i, j);
                }
            }
            return resMatrix;
        }
    
        /**
         * 生成条形码
         *
         * @param context
         * @param contents      需要生成的内容
         * @param desiredWidth  生成条形码的宽带
         * @param desiredHeight 生成条形码的高度
         * @param displayCode   是否在条形码下方显示内容
         * @return
         */
        public static Bitmap creatBarcode(Context context, String contents,
                                          int desiredWidth, int desiredHeight, boolean displayCode) {
            Bitmap ruseltBitmap = null;
            /**
             * 图片两端所保留的空白的宽度
             */
            int marginW = 20;
            /**
             * 条形码的编码类型
             */
            BarcodeFormat barcodeFormat = BarcodeFormat.CODE_128;
            if (displayCode) {
                Bitmap barcodeBitmap = encodeAsBitmap(contents, barcodeFormat, desiredWidth, desiredHeight);
                Bitmap codeBitmap = creatCodeBitmap(contents, desiredWidth + 2 * marginW, desiredHeight, context);
                ruseltBitmap = mixtureBitmap(barcodeBitmap, codeBitmap, new PointF(0, desiredHeight));
            } else {
                ruseltBitmap = encodeAsBitmap(contents, barcodeFormat, desiredWidth, desiredHeight);
            }
            return ruseltBitmap;
        }
    
        /**
         * 生成条形码的Bitmap
         *
         * @param contents 需要生成的内容
         * @param format 编码格式
         * @param desiredWidth
         * @param desiredHeight
         * @return
         * @throws WriterException
         */
        protected static Bitmap encodeAsBitmap(String contents, BarcodeFormat format, int desiredWidth, int desiredHeight) {
            final int WHITE = 0xFFFFFFFF;
            final int BLACK = 0xFF000000;
    
            MultiFormatWriter writer = new MultiFormatWriter();
            BitMatrix result = null;
            try {
                result = writer.encode(contents, format, desiredWidth,
                        desiredHeight, null);
            } catch (WriterException e) {
                e.printStackTrace();
            }
    
            int width = result.getWidth();
            int height = result.getHeight();
            int[] pixels = new int[width * height];
            // All are 0, or black, by default
            for (int y = 0; y < height; y++) {
                int offset = y * width;
                for (int x = 0; x < width; x++) {
                    pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;
                }
            }
            Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
            return bitmap;
        }
    
        /**
         * 生成显示编码的Bitmap
         *
         * @param contents
         * @param width
         * @param height
         * @param context
         * @return
         */
        protected static Bitmap creatCodeBitmap(String contents, int width, int height, Context context) {
            TextView tv = new TextView(context);
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            tv.setLayoutParams(layoutParams);
            tv.setText(contents);
            tv.setHeight(height);
            tv.setGravity(Gravity.CENTER_HORIZONTAL);
            tv.setWidth(width);
            tv.setDrawingCacheEnabled(true);
            tv.setTextColor(Color.BLACK);
            tv.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                    View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
            tv.layout(0, 0, tv.getMeasuredWidth(), tv.getMeasuredHeight());
    
            tv.buildDrawingCache();
            Bitmap bitmapCode = tv.getDrawingCache();
            return bitmapCode;
        }
    
        /**
         * 将两个Bitmap合并成一个
         *
         * @param first
         * @param second
         * @param fromPoint 第二个Bitmap开始绘制的起始位置(相对于第一个Bitmap)
         * @return
         */
        protected static Bitmap mixtureBitmap(Bitmap first, Bitmap second, PointF fromPoint) {
            if (first == null || second == null || fromPoint == null) {
                return null;
            }
            int marginW = 20;
            Bitmap newBitmap = Bitmap.createBitmap(
                    first.getWidth() + second.getWidth() + marginW,
                    first.getHeight() + second.getHeight(), Bitmap.Config.ARGB_4444);
            Canvas cv = new Canvas(newBitmap);
            cv.drawBitmap(first, marginW, 0, null);
            cv.drawBitmap(second, fromPoint.x, fromPoint.y, null);
            cv.save();
            cv.restore();
            return newBitmap;
        }
    
        /**
         * 识别图中是否有二维码
         * @param bitmap
         * @return
         */
        public static Result handleQRCodeFormBitmap(Bitmap bitmap) {
            Map<DecodeHintType, Object> hints = new EnumMap<>(DecodeHintType.class);
            hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
            hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
            hints.put(DecodeHintType.POSSIBLE_FORMATS, BarcodeFormat.QR_CODE);
    
            int width = bitmap.getWidth();
            int height = bitmap.getHeight();
            int[] data = new int[width * height];
            bitmap.getPixels(data, 0, width, 0, 0, width, height);
            RGBLuminanceSource source = new RGBLuminanceSource(width, height, data);
            BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));
            QRCodeReader reader2 = new QRCodeReader();
            Result result = null;
            try {
                result = reader2.decode(bitmap1, hints);
                Log.e("tag","result="+result.getText());
            } catch (Exception e) {
                e.printStackTrace();
                if (source != null) {
                    BinaryBitmap bitmap2 = new BinaryBitmap(new GlobalHistogramBinarizer(source));
                    try {
                        result = reader2.decode(bitmap2, hints);
                    } catch (Exception e1) {
                        e1.printStackTrace();
                    }
                }
            }
            return result;
        }
    }
    

    2.布局文件生成海报图片的工具类ImageUtils

    package com.junto.text.Posters;
    
    import android.graphics.Bitmap;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.os.Environment;
    import android.util.Log;
    import android.view.View;
    import android.widget.ImageView;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    /**
     * Created by WangJinyong on 2019/10/23.
     * 布局生成分享图片 工具类
     */
    public class ImageUtils {
    
        //然后View和其内部的子View都具有了实际大小,也就是完成了布局,相当与添加到了界面上。接着就可以创建位图并在上面绘制了:
        public static void layoutView(View v, int width, int height) {
            // 整个View的大小 参数是左上角 和右下角的坐标
            v.layout(0, 0, width, height);
            int measuredWidth = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);
            int measuredHeight = View.MeasureSpec.makeMeasureSpec(10000, View.MeasureSpec.AT_MOST);
            /** 当然,measure完后,并不会实际改变View的尺寸,需要调用View.layout方法去进行布局。
             * 按示例调用layout函数后,View的大小将会变成你想要设置成的大小。
             */
            v.measure(measuredWidth, measuredHeight);
            v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
        }
    
        public static String viewSaveToImage(View view, String child, ImageView img_show) {
            Log.e("tag","viewSaveToImage");
            /**
             * View组件显示的内容可以通过cache机制保存为bitmap
             * 我们要获取它的cache先要通过setDrawingCacheEnable方法把cache开启,
             * 然后再调用getDrawingCache方法就可 以获得view的cache图片了
             * 。buildDrawingCache方法可以不用调用,因为调用getDrawingCache方法时,
             * 若果 cache没有建立,系统会自动调用buildDrawingCache方法生成cache。
             * 若果要更新cache, 必须要调用destoryDrawingCache方法把旧的cache销毁,才能建立新的。
             */
            //        view.setDrawingCacheEnabled(true);
            //        view.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
            //设置绘制缓存背景颜色
            //        view.setDrawingCacheBackgroundColor(Color.WHITE);
    
            // 把一个View转换成图片
            Bitmap cachebmp = loadBitmapFromView(view);
    
            img_show.setImageBitmap(cachebmp);//直接展示转化的bitmap
    
            //保存在本地 产品还没决定要不要保存在本地
            FileOutputStream fos;
            try {
                // 判断手机设备是否有SD卡
                boolean isHasSDCard = Environment.getExternalStorageState().equals(
                        android.os.Environment.MEDIA_MOUNTED);
                if (isHasSDCard) {
                    // SD卡根目录
                    File sdRoot = Environment.getExternalStorageDirectory();
                    Log.e("tag","SD卡根目录="+sdRoot.toString());
                    File file = new File(sdRoot, child+".png");
                    fos = new FileOutputStream(file);
                } else
                    throw new Exception("创建文件失败!");
                //压缩图片 30 是压缩率,表示压缩70%; 如果不压缩是100,表示压缩率为0
                cachebmp.compress(Bitmap.CompressFormat.PNG, 90, fos);
    
                fos.flush();
                fos.close();
    
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            view.destroyDrawingCache();
            return sharePic(cachebmp,child);
        }
    
        /**
         * 把一个View转换成图片
         * @param v
         * @return
         */
        public static Bitmap loadBitmapFromView(View v) {
            int w = v.getWidth();
            int h = v.getHeight();
            Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
            Canvas c = new Canvas(bmp);
    
            /** 如果不设置canvas画布为白色,则生成透明 */
            c.drawColor(Color.WHITE);
    
            v.layout(0, 0, w, h);
            v.draw(c);
    
            return bmp;
        }
    
        //保存在本地并一键分享
        private static String sharePic(Bitmap cachebmp,String child) {
            final File qrImage = new File(Environment.getExternalStorageDirectory(), child+".jpg");
            if(qrImage.exists())
            {
                qrImage.delete();
            }
            try {
                qrImage.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
            FileOutputStream fOut = null;
            try {
                fOut = new FileOutputStream(qrImage);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            if(cachebmp == null)
            {
                return "";
            }
            cachebmp.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
            try {
                fOut.flush();
                fOut.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    //        Toast.makeText(this, "保存成功 " + qrImage.getPath().toString(), Toast.LENGTH_SHORT).show();
            return qrImage.getPath();
        }
    }
    

    3.保存图片到本地的工具类SaveImgToSD,这个类可以和上面第二个工具类整理合并成一个,里面有好几个方法在此例子里面的用不到的。

    package com.junto.text.tools;
    
    import android.graphics.Bitmap;
    import android.os.Environment;
    import android.util.Log;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    import static java.lang.System.out;
    
    /**
     * Created by WangJinyong on 2018/9/18.
     */
    
    public class SaveImgToSD {
    
        public static String filePath = "/sdcard/UVCCamera/";
    
        //将Bitmap图片保存到sd卡
        public static void saveBitmapToSD(Bitmap bt) {
            File path = Environment.getExternalStorageDirectory();
            File file = new File(path, System.currentTimeMillis() + ".jpg");
            out.println(Environment.getExternalStorageState() + "/Cool/" +"000000000000000000000000000");
            try {
                FileOutputStream out = new FileOutputStream(file);
                bt.compress(Bitmap.CompressFormat.JPEG, 90, out);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            out.flush();
            out.close();
        }
    
        /**
         * 保存bitmap到SD卡
         * @param bitName 保存的名字
         * @param mBitmap 图片对像
         * return 生成压缩图片后的图片路径
         */
        public static String saveMyBitmap(String bitName, Bitmap mBitmap) {
            makeRootDirectory();
            File f = new File(filePath + bitName + ".png");
            try {
                f.createNewFile();
            } catch (IOException e) {
                out.println("在保存图片时出错:" + e.toString());
            }
            FileOutputStream fOut = null;
            try {
                fOut = new FileOutputStream(f);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            try {
                mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
            } catch (Exception e) {
                return "create_bitmap_error";
            }
            try {
                fOut.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                fOut.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return filePath + bitName + ".png";
        }
    
        /**
         * 保存bitmap到SD卡
         * @param bitmap
         * @param imagename
         */
        public static String saveBitmapToSDCard(Bitmap bitmap, String imagename) {
            makeRootDirectory();
            String path = filePath + "img-" + imagename + ".jpg";
            FileOutputStream fos = null;
            try {
                fos = new FileOutputStream(path);
                if (fos != null) {
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
                    fos.close();
                }
    
                return path;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        //生成文件夹
        public static void makeRootDirectory(){
            File file = null;
            try {
                file = new File(filePath);
                if (!file.exists()){//判断指定的路径或者指定的目录文件是否已经存在。
                    file.mkdir();//建立文件夹
                    Log.e("cacacaca","新建文件夹成功,路径为:" + filePath);
                }
            }catch (Exception e){
                Log.e("error:", e+"");
            }
        }
    }
    

    到此,这篇文章就结束啦,有不足之处还请大家多多指正。

    展开全文
  • 通过将电子发票pdf文件中的信息及二维码摘录出来并进行识别,获得发票信息,期间用到zxing和spirePdf
  • 其实就是BITMAP对象过大了,在通过URI获取BITMAP对象的时候用getSmallBitmap()这样的方式就好,缩小对象的体积,不然就是OOM,如果你在写的时候还加了try….那么你可能基本看不到报错的信息。 ...

    其实就是BITMAP对象过大了,在通过URI获取BITMAP对象的时候用getSmallBitmap()这样的方式就好,缩小对象的体积,不然就是OOM,如果你在写的时候还加了try….那么你可能基本看不到报错的信息。

    附上方法:

    public static Bitmap getSmallerBitmap(Bitmap bitmap){
    int size = bitmap.getWidth()*bitmap.getHeight() / 160000;
    if (size <= 1) return bitmap; // 如果小于
    else {
    Matrix matrix = new Matrix();
    matrix.postScale((float) (1 / Math.sqrt(size)), (float) (1 / Math.sqrt(size)));
    Bitmap resizeBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
    return resizeBitmap;
    }
    }

    展开全文
  • 二维码识别和生成二维码 前言:有的时候需要进行二维码扫描,但是二维码是怎么在Unity进行生成呢?本文将介绍到,同时还会涉及到另外一个插件,可以进行对二维码的扫描。 准备资料:ZXing.Net.0.14.0.0.zip 作用...

    二维码识别和生成二维码

     

    前言:有的时候需要进行二维码扫描,但是二维码是怎么在Unity中进行生成呢?本文将介绍到,同时还会涉及到另外一个插件,可以进行对二维码的扫描。

     

    准备资料:

    ZXing.Net.0.14.0.0.zip 作用:实现二维码生成的库

    下载地址:链接:http://pan.baidu.com/s/1o67mG8i 密码:03t0

    Easy Code Scanner.unitypackage 作用:实现二维码扫描

    链接:http://pan.baidu.com/s/1c0vvPGs 密码:ek6e

     

     

    正文:

    一:二维码生成

    1:我们先实现二维码的生成吧,下载ZXing.Net.0.14.0.0.zip,下载地址:http://pan.baidu.com/s/1o67mG8i 密码 03t0

     

    下载完毕后,解压会发现有一个Unity的文件夹,把Unity文件夹下的三个文件都拖放到Unity编辑器中,这三个文件是生成二维码的类库

    2:创建一个名称为BarcodeCamC#脚本,然后把以下脚本拖放进去,把脚本拖放到摄像机运行即可,就可以根据参数生成二维码了。

    脚本,

     

    [csharp] view plain copy
    1. using UnityEngine;  
    2. using System.Collections;  
    3. using ZXing;  
    4. using ZXing.QrCode;  
    5. using System;  
    6. using System.IO;  
    7. public class BarcodeCam : MonoBehaviour  
    8. {  
    9.     public Texture2D encoded;//生成的二维码为Texture2D类型  
    10.     public string Lastresult;//二维码中所包含的内容信息,我是使用了GUID进行代替  
    11.   public   int count = 5;//生成几个二维码  
    12.     void Start()  
    13.     {  
    14.    
    15.         encoded = new Texture2D(256, 256);  
    16.         for (int i = 0; i < count; i++)  
    17.         {  
    18.             Guid idKey = Guid.NewGuid();  
    19.             Lastresult = idKey.ToString();  
    20.             var textForEncoding = Lastresult;  
    21.             if (textForEncoding != null)  
    22.             {  
    23.                 var color32 = Encode(textForEncoding, encoded.width, encoded.height);  
    24.                 encoded.SetPixels32(color32);  
    25.                 encoded.Apply();  
    26.                 byte[] bytes = encoded.EncodeToPNG();//把二维码转成byte数组,然后进行输出保存为png图片就可以保存下来生成好的二维码  
    27.                 if (!Directory.Exists(Application.dataPath + "/AdamBieber"))//创建生成目录,如果不存在则创建目录  
    28.                 {  
    29.                     Directory.CreateDirectory(Application.dataPath + "/AdamBieber");  
    30.                 }  
    31.                 string fileName = Application.dataPath + "/AdamBieber/" + idKey + ".png";  
    32.                 System.IO.File.WriteAllBytes(fileName, bytes);  
    33.             }  
    34.         }  
    35.     }  
    36.    
    37.    
    38.     private static Color32[] Encode(string textForEncoding, int width, int height)  
    39.     {  
    40.         var writer = new BarcodeWriter  
    41.         {  
    42.             Format = BarcodeFormat.QR_CODE,  
    43.             Options = new QrCodeEncodingOptions  
    44.             {  
    45.                 Height = height,  
    46.                 Width = width  
    47.             }  
    48.         };  
    49.         return writer.Write(textForEncoding);  
    50.     }  
    51.    
    52.     void OnGUI()  
    53.     {  
    54.         GUI.DrawTexture(new Rect(100, 100, 256, 256), encoded);  
    55.     }  
    56.    
    57. }  
    58.    


    二:识别二维码

    下载Easy Code Scanner.unitypackage,下载链接:http://pan.baidu.com/s/1c0vvPGs 密码:ek6e

    把下载的unitypackage拖放到Unity中,然后会看到Easy Code Scanner文件夹,文件夹下面有个 EasyCodeScannerscene的文件,打开查看写的demo

     

    其中Main Camera上面挂在的EasyCodeScannerExample就是识别二维码的代码,其中该脚本中的dataStr字符串为识别二维码后的信息,当然,你想要识别后做什么就是你自己的事情了。



    PS:总有人说扫描过程中闪退了,其实这个道理很简单,竖屏状态下扫描然后切换横屏,或者横屏状态扫描又切换到竖屏,不知道怎么适配屏幕,说白了就是屏幕自适应,打开你的Android配置文件AndroidManifest.xml,添加android:configChanges="keyboardHidden|orientation|screenSize一句话就可以了,如图:


    展开全文
  • [b]前提:[/b] [color=red]本文使用了 ...在 Module 文件夹下的 build.gradle 文件中追加 zxing 依赖: [code="gradle"]compile 'com.google.zxing:core:3.3.0'[/code] 之后添加图片长按事件(此处使...
    [b]前提:[/b]
    [color=red]本文使用了 ButterKnife 依赖库[/color]

    开始环境: Android Studio

    在 Module 文件夹下的 build.gradle 文件中追加 zxing 依赖:
    compile 'com.google.zxing:core:3.3.0'

    之后添加图片长按事件(此处使用了 ButterKnife 的注解),并实现识别二维码的功能:
    @OnLongClick({R.id.imageView})
    public boolean btnLongClick(final ImageView iv) {
    Logger.info(TAG, "Long click on image");

    new AlertDialog.Builder(getActivity())
    .setPositiveButton(R.string.recognize_qr_code, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
    progressBar.setVisibility(View.VISIBLE);

    Bitmap obmp = ((BitmapDrawable) (iv.getDrawable())).getBitmap();
    int width = obmp.getWidth();
    int height = obmp.getHeight();
    int[] data = new int[width * height];
    obmp.getPixels(data, 0, width, 0, 0, width, height);
    RGBLuminanceSource source = new RGBLuminanceSource(width, height, data);
    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

    new QrCodeAsyncTask().execute(bitmap);
    }
    }).show();

    return true;
    }

    class QrCodeAsyncTask extends AsyncTask<BinaryBitmap, Void, Result> {

    @Override
    protected Result doInBackground(BinaryBitmap... params) {
    QRCodeReader reader = new QRCodeReader();
    Result result = null;
    try {
    result = reader.decode(params[0]);
    } catch (NotFoundException e) {
    e.printStackTrace();
    } catch (ChecksumException e) {
    e.printStackTrace();
    } catch (FormatException e) {
    e.printStackTrace();
    }
    return result;
    }

    @Override
    protected void onPostExecute(Result result) {
    super.onPostExecute(result);
    progressBar.setVisibility(View.GONE);

    String text = result.getText();
    Logger.info(TAG, "QR CODE: " + text);
    Toast.makeText(getActivity(), text, Toast.LENGTH_SHORT).show();
    }
    }
    展开全文
  • ofd版式文件格式是我国自行...终于功夫不负有心人,最近取得了重大的技术突破,目前已实现提取和解析文件中包含的二维码图片不必再借助第三方软件来转换了,大大简化了处理此类文件时的流程节省了处理时间。 ...
  • 图片识别二维码,同一信息多次生成二维码,生成的二维码的构造是一样的吗? 近十年来,我国电子信息技术飞速发展,在这个通信技术高速发展的时代,产生的众多产品对我们的生活产生了重大的影响,它们让我们的生活变...
  • 使用python,识别是否是二维码图片

    千次阅读 2018-01-25 16:12:41
    如何在不使用python三方库的情况下,利用网上的一些三方平台识别一张图片是不是二维码 利用爬虫原理,使用python来识别一张图片是不是二维码
  • 二维码识别和生成二维码   前言:有的时候需要进行二维码扫描,但是二维码是怎么在Unity进行生成呢?本文将介绍到,同时还会涉及到另外一个插件,可以进行对二维码的扫描。   准备资料: ZXing...
  • 现在微信分享的功能很多,从分享的链接下载apk安卓包是很正常的,但是微信不让下载apk包,只能...在需要下载的页面加入下面的代码   &lt;div class="weixin-tip" style="display:non...
  • Java 识别读取pdf二维码信息

    千次阅读 2019-10-25 14:45:32
    本文章内容 通过Java程序识别、读取二维码存储的...**1、把pdf转成图片格式,因为只能识别png或jpg等图片文件中二维码。**下面以png格式为例,代码如下: /** * pdf 转 png */ public void pdfFileToI...
  • 识别二维码 上一篇博文已经制作了一个二维码,现在是如何把它识别出来,(当然识别出来的是一个链接,并把它保存起来) 使用的工具是pycharm 识别二维码无非就是调用open cv 来识别,代码大同小异 import cv2 from ...
  • C#或者asp.net开发二维码生成或识别需要引用的动态链接库文件
  • JS识别二维码、JS生成二维码

    万次阅读 2018-06-30 16:28:37
    最近的项目使用到了识别二维码和生成二维码,都是用JS生成的,应用在了移动端,在网上搜罗了许多进行验证,下面是我在项目应用的: 识别二维码 1.JS文件和测试页面压缩包:...
  • 安卓App可传文件的动态二维码V2 文件保存优化,还在在私有目录但...二维码生成与识别 可传文件二维码 无网传输 电脑手机互传 配合https://download.csdn.net/download/fencer911/14946341可实现电脑手机互传(无网)
  • zxing jar文件,用于Android生成二维码识别二维码,解压后放在libs文件夹内导入
  • jquery.min - jsQR - qrcode - qrscan - reqrcode
  • yolo_二维码识别配置文件.rar
  • 最近在做二维码扫描的时候用的是zxing但是在进行本地相册二维码识别的时候返回的结果一直是null 开始直接放的是图片地址后面网上搜了一下说的是图片太小要放大 public static Bitmap getSmallerBitmap(Bitmap ...
  • 1.之前有找过识别二维码的插件,但是遇到了些问题,具体表现为文字识别不了,带get参数识别不了。正常的普通链接没问题。 2.找了一天也没找到一个正常的。吐槽一下网上的教程正是什么样的都有,真是醉了。 3.找了一...
  • VS2010使用zxing识别图片二维码

    千次阅读 2019-07-22 23:57:02
    在实际项目工程,通过使用ZXing编译的库文件,在VC2010的使用MFC框架实现,动态识别图片二维码。 实现过程,通过网上搜索C#、C++之类的第三方插件,实现功能,效果都不是很理想,最后在csdn找到了这一片...
  • <view><image src='{{img_l}}' bindtap='preview_img'></image></view>//图片上传后预览、保存、识别 js代码: page({ data: { img_list:'' }, chooseImg:function(){//调用 var _this = this; wx.chooseImage...
  • PHP识别二维码中的图片

    千次阅读 2018-07-23 16:32:32
    最开始找的方法是一个叫 php-zbarcode 的扩展,自己照着网上的安装步骤安装了 ...然后是在github上找到了一个叫 php-qrcode-detector-decoder 的扩展,安装方法和使用方法如下,但安装完成后,只能识别只有二维码的...
  • libdmtx结合OpenCV识别DataMatrix二维码

    千次阅读 2019-10-13 17:56:11
    Datamatrix原名Datacode,由美国国际资料公司(International Data Matrix, ...Datamatrix的最小尺寸是目前所有条码最小的,尤其特别适用于小零件的标识,以及直接印刷在实体上。 本文介绍的是使用libdmtx结合Op...
  • 集成百度身份证识别插件ocr_ui-release.aar后发现二维码扫描的速度明显变慢,无论是使用zxing还是使用华为的统一扫码服务会出现此问题。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,669
精华内容 10,267
关键字:

怎么识别文件中的二维码