Skip to content

Dpuntu/String2Bitmap

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 

Repository files navigation

String2Bitmap

将文字生成图片的Utils

  bitmapToByteArrayForPrinter方法
  
  该方法比较容易理解:
  
      1.方法参数是待打印的文字的List集合,其中存放的就是一行行待打印的文字
      2.读入参数后,先配置生成图片的宽度[为8的倍数],然后把每一行文字读入计,并计算这一行是否可以完全显示,如果不能一行显示需要多少行
      3.设置文字的大小高度并计算一行文字的高度
      4.生成空的位图
      5.开始遍历List集合,绘制每一行
      6.返回生成的图片
  
  对于图片的合并,这个比文字生成图片更简单一点:
  
      1.取出两张位图,把最宽的设置为宽度,高度之和设置为生成图片的高度

          int width = Math.max(first.getWidth(), second.getWidth());
          int height = first.getHeight() + second.getHeight();

      2.这里比较麻烦的就是 logo的位置必须居中显示,所以我们需要把logo绘制的起点改变一下

          int startWidth = (width - first.getWidth()) / 2;

      3.绘制即可

          Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
          Canvas canvas = new Canvas(result);
          canvas.drawBitmap(first, startWidth, 0, null);
          canvas.drawBitmap(second, 0, first.getHeight(), null);
  
  原本List集合是文字,在List集合泛型的时候,不能在单纯的传入一个字段了,而是携带信息的参数
  
			   /**
			     * @param text           等待打印的字段
			     * @param isRightOrLeft  可空,默认右边
			     * @param isSmallOrLarge 可空,默认小字
			     */
			    public StringBitmapParameter(String text, int isRightOrLeft, int isSmallOrLarge) {
			        this.text = text;
			        this.isRightOrLeft = isRightOrLeft;
			        this.isSmallOrLarge = isSmallOrLarge;
			    }
		 在把文字构建图片的时候,由于是List存储的既是一行,所以我们这样做可以把每一行设置成左便开始打印还是右边,文字设置为大还是小,但是不能把文字的字体样式修改了
		 	 for (StringBitmapParameter mParameter : mBreakString) {
		            String str = mParameter.getText();

		            if (mParameter.getIsSmallOrLarge() == IS_SMALL) {
		                paint.setTextSize(SMALL_TEXT);
		            } else if (mParameter.getIsSmallOrLarge() == IS_LARGE) {
		                paint.setTextSize(LARGE_TEXT);
		            }

		            if (mParameter.getIsRightOrLeft() == IS_RIGHT) {
		                x = WIDTH - paint.measureText(str);
		            } else if (mParameter.getIsRightOrLeft() == IS_LEFT) {
		                x = START_LEFT;
		            } else if (mParameter.getIsRightOrLeft() == IS_CENTER) {
		                x = (WIDTH - paint.measureText(str)) / 2.0f;
		            }

		            if (str.isEmpty() | str.contains("\n") | mParameter.getIsSmallOrLarge() == IS_LARGE) {
		                canvas.drawText(str, x, y + FontHeight / 2, paint);
		                y = y + FontHeight;
		            } else {
		                canvas.drawText(str, x, y, paint);
		            }
		            y = y + FontHeight;
		        }
          
		 这里展示的即是关键位置
		 在图片的压缩这一部分,之前是ARGB_8888的,现在修改为了RGB_565,基本占内存小了一半,前者一个像素32位,后则16位,还有个模式是ALPHA_8仅仅有8位,但是这个模式下,打印出来的是纯黑的玩意,他只有透明度,没有颜色,所以不行,打印的时候也是把它变成黑白的打印的,而且这应该是压缩的极致了
		 现在就是合并图片生成的太慢,我觉得是我这里导致的:
   
		   for (int i = 0; i < result.getWidth(); i++) {
	            for (int j = 0; j < result.getHeight(); j++) {
	                result.setPixel(i, j, Color.WHITE);
	            }
	        }
        
	     这个循环是为了把没个像素点都变成白的,然后再绘图,因为不这样做的话,图片打印出来,周边会有黑色条文,就是因为没有配色,他是透明的,所以打出来就是黑的导致的
	     所以如果把这个O(n^2)改变的话,就应该能加快生成图片的速度

About

将文字生成图片的Utils

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages