RectManager.m 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. //
  2. // RectManager.m
  3. // BankCard
  4. //
  5. // Created by XAYQ-FanXL on 16/7/8.
  6. // Copyright © 2016年 AN. All rights reserved.
  7. //
  8. #import "RectManager.h"
  9. char numbers[256];
  10. CGRect rects[64];
  11. @implementation RectManager
  12. + (CGRect)getEffectImageRect:(CGSize)size {
  13. CGSize size2 = [UIScreen mainScreen].bounds.size;
  14. CGPoint point;
  15. if(size.width/size.height > size2.width/size2.height) {
  16. float oldW = size.width;
  17. size.width = size2.width / size2.height * size.height;
  18. point.x = (oldW - size.width)/2;
  19. point.y = 0;
  20. }
  21. else {
  22. float oldH = size.height;
  23. size.height = size2.height / size2.width * size.width;
  24. point.x = 0;
  25. point.y = (oldH - size.height)/2;;
  26. }
  27. return CGRectMake(point.x, point.y, size.width, size.height);
  28. }
  29. + (CGRect)getGuideFrame:(CGRect)rect {
  30. float previewWidth = rect.size.height;
  31. float previewHeight = rect.size.width;
  32. float cardh, cardw;
  33. float left, top;
  34. cardw = previewWidth*70/100;
  35. //if(cardw < 720) cardw = 720;
  36. if(previewWidth < cardw)
  37. cardw = previewWidth;
  38. cardh = (int)(cardw / 0.63084f);
  39. left = (previewWidth-cardw)/2;
  40. top = (previewHeight-cardh)/2;
  41. return CGRectMake(top+rect.origin.x, left+rect.origin.y, cardh, cardw);
  42. }
  43. + (int)docode:(unsigned char *)pbBuf len:(int)tLen {
  44. int hic, lwc;
  45. int i, j, code;
  46. int x, y, w, h;
  47. int charCount = 0;
  48. int charNum = 0;
  49. char szBankName[128];
  50. //字符解析,包含空格
  51. i = 0;
  52. hic = pbBuf[i++]; lwc = pbBuf[i++]; code = (hic<<8)+lwc;
  53. hic = pbBuf[i++]; lwc = pbBuf[i++]; code = (hic<<8)+lwc;
  54. //bank name, GBK CharSet;
  55. for(j = 0; j < 64; ++j) { szBankName[j] = pbBuf[i++]; }
  56. //charNum
  57. hic = pbBuf[i++]; lwc = pbBuf[i++]; code = (hic<<8)+lwc;
  58. charNum = code;
  59. //char code and its rect
  60. while(i < tLen-9){
  61. //字符的编码unsigned short
  62. hic = pbBuf[i++]; lwc = pbBuf[i++]; x = (hic<<8)+lwc;
  63. numbers[charCount] = (char)x;
  64. //字符的矩形框lft, top, w, h
  65. hic = pbBuf[i++]; lwc = pbBuf[i++]; x = (hic<<8)+lwc;
  66. hic = pbBuf[i++]; lwc = pbBuf[i++]; y = (hic<<8)+lwc;
  67. hic = pbBuf[i++]; lwc = pbBuf[i++]; w = (hic<<8)+lwc;
  68. hic = pbBuf[i++]; lwc = pbBuf[i++]; h = (hic<<8)+lwc;
  69. rects[charCount] = CGRectMake(x, y, w, h);
  70. charCount++;
  71. }
  72. numbers[charCount] = 0;
  73. if(charCount < 10 || charCount > 24 || charNum != charCount){
  74. charCount = 0;
  75. }
  76. return charCount;
  77. }
  78. + (CGRect)getCorpCardRect:(int)width height:(int)height guideRect:(CGRect)guideRect charCount:(int) charCount {
  79. CGRect subRect = rects[0];
  80. int i;
  81. int nAvgW = 0;
  82. int nAvgH = 0;
  83. int nCount = 0;
  84. nAvgW = rects[0].size.width;
  85. nAvgH = rects[0].size.height;
  86. nCount = 1;
  87. //所有非空格的字符的矩形框合并
  88. for(i = 1; i < charCount; ++i){
  89. subRect = combinRect(subRect, rects[i]);
  90. if(numbers[i] != ' '){
  91. nAvgW += rects[i].size.width;
  92. nAvgH += rects[i].size.height;
  93. nCount ++;
  94. }
  95. }
  96. //统计得到的平均宽度和高度
  97. nAvgW /= nCount;
  98. nAvgH /= nCount;
  99. //releative to the big image(相对于大图)
  100. subRect.origin.x = subRect.origin.x + guideRect.origin.x;
  101. subRect.origin.y = subRect.origin.y + guideRect.origin.y;
  102. // rect.offset(guideRect.left, guideRect.top);
  103. //做一个扩展
  104. subRect.origin.y -= nAvgH; if(subRect.origin.y < 0) subRect.origin.y = 0;
  105. subRect.size.height += nAvgH * 2; if(subRect.size.height+subRect.origin.y >= height) subRect.size.height = height-subRect.origin.y-1;
  106. subRect.origin.x -= nAvgW; if(subRect.origin.x < 0) subRect.origin.x = 0;
  107. subRect.size.width += nAvgW * 2; if(subRect.size.width+subRect.origin.x >= width) subRect.size.width = width-subRect.origin.x-1;
  108. return subRect;
  109. }
  110. + (char *)getNumbers {
  111. return numbers;
  112. }
  113. CGRect combinRect(CGRect A, CGRect B)
  114. {
  115. CGFloat t,b,l,r;
  116. l = fminf(A.origin.x, B.origin.x);
  117. r = fmaxf(A.size.width+A.origin.x, B.size.width+B.origin.x);
  118. t = fminf(A.origin.y, B.origin.y);
  119. b = fmaxf(A.size.height+A.origin.y, B.size.height+B.origin.y);
  120. return CGRectMake(l, t, r-l, b-t);
  121. }
  122. @end