生成二维码的工具类(带标题)
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import java.util.Hashtable;
public class QRCodeUtil {
private static final String CHARSET = "UTF-8";
private static final String FORMAT_NAME = "JPG";
// 二维码尺寸
private static final int QRCODE_SIZE = 314;
// LOGO宽度
private static final int WIDTH = 60;
// LOGO高度
private static final int HEIGHT = 60;
public static Bitmap createImage(String content) {
Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
hints.put(EncodeHintType.MARGIN, 2);
BitMatrix bitMatrix = null;
Bitmap image = null;
try {
bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);
int width = bitMatrix.getWidth();
int height = bitMatrix.getHeight();
int[] pixels = new int[width*height];
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
if (bitMatrix.get(y,x)){
pixels[y*width +x] = 0xff000000;
}else {
pixels[y*width + x] = 0xffffffff;
}
// image.setPixel(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
}
}
image = Bitmap.createBitmap(pixels,width,height,Bitmap.Config.ARGB_8888);
} catch (Exception e) {
e.printStackTrace();
}
// 插入图片
// QRCodeUtil.insertImage(image, logoImgPath, needCompress);
return image;
}
public static Bitmap createImage(String content,String title) {
int picWidth = 720;//生成图片的宽度
int picHeight = 765;//生成图片的高度
int titleTextSize = 30;
int contentTextSize = 22;
int textColor = Color.BLACK;
int qrWidth = 466;
int qrHeight = 466;
int paddingTop = 152;
int paddingMiddle = 40;
int paddingBottom = 24;
//最终生成的图片
Bitmap result = Bitmap.createBitmap(picWidth,picHeight,Bitmap.Config.ARGB_8888);
Paint paint = new Paint();
paint.setColor(Color.WHITE);
Canvas canvas = new Canvas(result);
//先画一整块白色矩形块
canvas.drawRect(0,0,picWidth,picHeight,paint);
//画title文字
Rect bounds = new Rect();
paint.setColor(textColor);
paint.setTextSize(titleTextSize);
//获取文字的字宽高,以便将文字与图片中心对齐
paint.getTextBounds(title,0,title.length(),bounds);
canvas.drawText(title,picWidth/2-bounds.width()/2,paddingTop+bounds.height()/2,paint);
//画白色矩形块
int qrTop = paddingTop+titleTextSize+paddingMiddle;//二维码的顶部高度
//画二维码
Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
hints.put(EncodeHintType.MARGIN, 5);
BitMatrix bitMatrix;
Bitmap image = null;
try {
bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, qrWidth, qrHeight, hints);
int width = bitMatrix.getWidth();
int height = bitMatrix.getHeight();
image = Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setPixel(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
}
}
} catch (Exception e) {
e.printStackTrace();
}
paint.setColor(Color.BLACK);
canvas.drawBitmap(image,(picWidth-qrWidth)/2,qrTop,paint);
//画文字
paint.setColor(Color.BLACK);
paint.setTextSize(contentTextSize);
int lineTextCount = (int)((picWidth-50)/contentTextSize);
int line = (int)(Math.ceil(Double.valueOf(content.length())/Double.valueOf(lineTextCount)));
int textTop = qrTop+qrHeight+paddingBottom;//地址的顶部高度
for (int i = 0 ; i < line ; i++){
String s;
if (i == line-1){
s = content.substring(i*lineTextCount,content.length());
}else {
s = content.substring(i * lineTextCount,(i+1)*lineTextCount);
}
paint.getTextBounds(content,0,s.length(),bounds);
canvas.drawText(s,picWidth/2-bounds.width()/2,textTop+i*contentTextSize+i*5+bounds.height()/2,paint);
}
canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();
return result;
}
}
调用:
Bitmap bitmap=QRCodeUtil.createImage("测试","电子科技");
iv.setImageBitmap(bitmap);
Activity:
public class MainActivityFour extends FragmentActivity {
@Bind(R.id.iv)
ImageView iv;
private VrPanoramaView mVrPanoramaView;
private VrPanoramaView.Options paNormalOptions;
private static final int REQUEST_PERMISSION = 0;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_four);
ButterKnife.bind(this);
Bitmap bitmap=QRCodeUtil.createImage("测试","电子科技");
iv.setImageBitmap(bitmap);
//initVrPaNormalView();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int hasWritePermission = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
int hasReadPermission = checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
List<String> permissions = new ArrayList<String>();
if (hasWritePermission != PackageManager.PERMISSION_GRANTED) {
permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
} else {
// preferencesUtility.setString("storage", "true");
}
if (hasReadPermission != PackageManager.PERMISSION_GRANTED) {
permissions.add(Manifest.permission.READ_EXTERNAL_STORAGE);
} else {
// preferencesUtility.setString("storage", "true");
}
if (!permissions.isEmpty()) {
// requestPermissions(permissions.toArray(new String[permissions.size()]), REQUEST_CODE_SOME_FEATURES_PERMISSIONS);
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE},
REQUEST_PERMISSION);
}
}
iv.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View viewm) {
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 bitmap1 = new BinaryBitmap(new HybridBinarizer(source));
QRCodeReader reader = new QRCodeReader();
Result re = null;
try {
re = reader.decode(bitmap1);
} catch (NotFoundException e) {
e.printStackTrace();
} catch (ChecksumException e) {
e.printStackTrace();
} catch (FormatException e) {
e.printStackTrace();
}
if (re == null) {
showAlert(obmp);
} else {
showSelectAlert(obmp, re.getText());
}
//saveImage("测试图片",obmp);
return false;
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case REQUEST_PERMISSION: {
for (int i = 0; i < permissions.length; i++) {
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
System.out.println("Permissions --> " + "Permission Granted: " + permissions[i]);
} else if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
System.out.println("Permissions --> " + "Permission Denied: " + permissions[i]);
}
}
}
break;
default: {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
}
//保存文件到指定路径
public static boolean saveImageToGallery(Context context, Bitmap bmp) {
// 首先保存图片
String storePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "dearxy";
File appDir = new File(storePath);
if (!appDir.exists()) {
appDir.mkdir();
}
String fileName = System.currentTimeMillis() + ".jpg";
File file = new File(appDir, fileName);
try {
FileOutputStream fos = new FileOutputStream(file);
//通过io流的方式来压缩保存图片
boolean isSuccess = bmp.compress(Bitmap.CompressFormat.JPEG, 60, fos);
fos.flush();
fos.close();
//把文件插入到系统图库
//MediaStore.Images.Media.insertImage(context.getContentResolver(), file.getAbsolutePath(), fileName, null);
//保存图片后发送广播通知更新数据库
Uri uri = Uri.fromFile(file);
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
if (isSuccess) {
return true;
} else {
return false;
}
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
public String saveImage(String name, Bitmap bmp) {
File appDir = new File(Environment.getExternalStorageDirectory() + File.separator + Environment.DIRECTORY_DCIM+File.separator+"Camera"+File.separator);
if (!appDir.exists()) {
appDir.mkdir();
}
String fileName = name + ".jpg";
File file = new File(appDir, fileName);
try {
FileOutputStream fos = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
try {
MediaStore.Images.Media.insertImage(getContentResolver(),
file.getAbsolutePath(), fileName, null);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 最后通知图库更新
Uri localUri = Uri.fromFile(file);
Intent localIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, localUri);
sendBroadcast(localIntent);
return file.getAbsolutePath();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
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) {
//saveImageToGallery(bitmap);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterfacem, int i) {
}
});
builder.show();
}
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: {
saveImageToGallery(getApplicationContext(),bitmap);
//saveImage("测试图片",bitmap);
}
break;
case 1: {
// Intent n = new Intent(EnlargeimagevActivity.this, DetailActivity.class);
// n.putExtra(DetailActivity.BUNDLE_KEY_DISPLAY_TYPE, DetailActivity.WEBVIEW_DETAIL);
// n.putExtra(DetailwebFragment.WEB_URL, url);
// startActivity(n);
}
break;
}
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterfacem, int i) {
}
});
builder.show();
}
//初始化VR图片
private void initVrPaNormalView() {
// mVrPanoramaView = (VrPanoramaView) findViewById(R.id.mVrPanoramaView);
// paNormalOptions = new VrPanoramaView.Options();
// paNormalOptions.inputType = VrPanoramaView.Options.TYPE_MONO;
// mVrPanoramaView.setFullscreenButtonEnabled(false); //隐藏全屏模式按钮
// mVrPanoramaView.setInfoButtonEnabled(false); //设置隐藏最左边信息的按钮
// mVrPanoramaView.setStereoModeButtonEnabled(false); //设置隐藏立体模型的按钮
// mVrPanoramaView.setEventListener(new ActivityEventListener()); //设置监听
// //加载本地的图片源
// mVrPanoramaView.loadImageFromBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.andes), paNormalOptions);
//设置网络图片源
// panoWidgetView.loadImageFromByteArray();
}
private class ActivityEventListener extends VrPanoramaEventListener {
@Override
public void onLoadSuccess() {//图片加载成功
}
@Override
public void onLoadError(String errorMessage) {//图片加载失败
}
@Override
public void onClick() {//当我们点击了VrPanoramaView 时候触发 super.onClick();
}
@Override
public void onDisplayModeChanged(int newDisplayMode) {
super.onDisplayModeChanged(newDisplayMode);
}
}
}
布局activity_four.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#EEEEEE">
<!--<com.google.vr.sdk.widgets.pano.VrPanoramaView-->
<!--android:id="@+id/mVrPanoramaView"-->
<!--android:layout_width="match_parent"-->
<!--android:layout_height="30dp"/>-->
<ImageView
android:layout_width="match_parent"
android:layout_height="350dp"
android:layout_margin="30dp"
android:id="@+id/iv"/>
</LinearLayout>
备注:compile ‘com.google.zxing:core:3.3.0’
开发工具 Android studio 2.0