ScaleCJ.as 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640
  1. package com.imt.intimamedia.helpers
  2. {
  3. import flash.display.*;
  4. import flash.geom.Point;
  5. import flash.text.TextField;
  6. import flash.text.TextFormat;
  7. import mx.controls.Alert;
  8. // Added by Jdeppe march 2012
  9. // CJ suffix because first coder of Scale object (IMT V1) was Christophe Jacquelin
  10. // IMT Paris Opera district
  11. public class ScaleCJ
  12. {
  13. private var m_ptClick0:PointCJ = new PointCJ(); // Point du premier click souris
  14. private var m_ptClick1:PointCJ = new PointCJ(); // Point du 2ème click souris
  15. private var m_dblDistance:Number; // Distance en pixels entre les 2 points de l'échelle
  16. public var m_nbPoints:int; // Nombre de points de l'échelle
  17. [ArrayElementType("PointCJ")]
  18. public var m_points:Array = new Array(512);
  19. private var m_found:Boolean; // Une échelle a été détectée
  20. public var m_length:int; // Longueur Echelle
  21. private var m_label:TextField = new TextField();
  22. private var m_x1debug:int;
  23. private var m_x2debug:int;
  24. public function ScaleCJ()
  25. {
  26. var i:int;
  27. m_found = false;
  28. m_label.x = 0;
  29. m_label.y = 0;
  30. for (i = 0; i < 512; i++)
  31. {
  32. m_points[i] = new PointCJ();
  33. m_points.x = 0;
  34. m_points.y = 0;
  35. }
  36. m_nbPoints = 0;
  37. m_ptClick0.x = 0;
  38. m_ptClick0.y = 0;
  39. m_ptClick1.x = 0;
  40. m_ptClick1.y = 0;
  41. }
  42. public function getXFirstPoint() : int
  43. {
  44. return m_points[0].x;
  45. }
  46. public function getYFirstPoint() : int
  47. {
  48. return m_points[0].y;
  49. }
  50. public function getXLastPoint() : int
  51. {
  52. return m_points[m_nbPoints-1].x;
  53. }
  54. public function getYLastPoint() : int
  55. {
  56. return m_points[m_nbPoints-1].y;
  57. }
  58. public function setClickPoints(x1:int, y1:int, x2:int, y2:int):void
  59. {
  60. m_ptClick0.x = x1;
  61. m_ptClick0.y = y1;
  62. m_ptClick1.x = x2;
  63. m_ptClick1.y = y2;
  64. }
  65. public function setPoints(x1:int, y1:int, x2:int, y2:int):void
  66. {
  67. m_points[0].x = x1;
  68. m_points[0].y = y1;
  69. m_points[1].x = x2;
  70. m_points[1].y = y2;
  71. }
  72. public function setLength(length : int) : void
  73. {
  74. m_length = length;
  75. }
  76. public function getLength(): int
  77. {
  78. return m_length;
  79. }
  80. public function setNbPoints(nbPoints:int) : void
  81. {
  82. m_nbPoints = nbPoints;
  83. }
  84. public function setScaleFound(found:Boolean) : void
  85. {
  86. m_found = found;
  87. }
  88. public function setDistance(distance:Number) : void
  89. {
  90. m_dblDistance = distance;
  91. }
  92. public static function pointxOriginalToResize(x:int, oridimh:int, oridimv:int, resizedimh:int):int
  93. {
  94. var result:int;
  95. var ratio : Number;
  96. var newdimh : int;
  97. var newdimv : int;
  98. var y : int ;
  99. ratio = Number(oridimh) / Number(oridimv);
  100. if (ratio <= (4.0 / 3.0))
  101. {
  102. newdimv = oridimv;
  103. newdimh = int((4.0 * oridimv) / 3.0);
  104. }
  105. else
  106. {
  107. newdimh = oridimh;
  108. newdimv = int ((3.0 * oridimh) / 4.0);
  109. }
  110. if (newdimv >= oridimv)
  111. {
  112. // ------------
  113. //
  114. // ------------
  115. // xxxxxxxxxxxx
  116. // ------------
  117. //
  118. // ------------
  119. // x = x;
  120. x = x + ((newdimh - oridimh) / 2);
  121. y = y + ((newdimv - oridimv) / 2);
  122. }
  123. else if (newdimh >= oridimh)
  124. {
  125. // | | x | |
  126. // | | x | |
  127. // | | x | |
  128. // | | x | |
  129. // | | x | |
  130. // | | x | |
  131. // Alert.show("newdimh > dimh");
  132. x = x + ((newdimh - oridimh) / 2);
  133. y = y + ((newdimv - oridimv) / 2);
  134. // y = y;
  135. }
  136. x = (x * resizedimh) / newdimh;
  137. return x;
  138. }
  139. public static function pointyOriginalToResize(y:int, oridimh:int, oridimv:int, resizedimv:int ):int
  140. {
  141. var result:int;
  142. var ratio : Number;
  143. var newdimh : int;
  144. var newdimv : int;
  145. var x : int ;
  146. ratio = Number(oridimh) / Number(oridimv);
  147. if (ratio <= (4.0 / 3.0))
  148. {
  149. newdimv = oridimv;
  150. newdimh = int((4.0 * oridimv) / 3.0);
  151. }
  152. else
  153. {
  154. newdimh = oridimh;
  155. newdimv = int ((3.0 * oridimh) / 4.0);
  156. }
  157. if (newdimv >= oridimv)
  158. {
  159. // ------------
  160. //
  161. // ------------
  162. // xxxxxxxxxxxx
  163. // ------------
  164. //
  165. // ------------
  166. // x = x;
  167. x = x + ((newdimh - oridimh) / 2);
  168. y = y + ((newdimv - oridimv) / 2);
  169. }
  170. else if (newdimh >= oridimh)
  171. {
  172. // | | x | |
  173. // | | x | |
  174. // | | x | |
  175. // | | x | |
  176. // | | x | |
  177. // | | x | |
  178. // Alert.show("newdimh > dimh");
  179. x = x + ((newdimh - oridimh) / 2);
  180. y = y + ((newdimv - oridimv) / 2);
  181. // y = y;
  182. }
  183. y = (y * resizedimv) / newdimv;
  184. return y;
  185. }
  186. // Dessine l'échelle
  187. public function onDraw(origdimh:int, origdimv:int, resizeedimh:int, resizeedimv:int, graph:Graphics):void
  188. {
  189. var point1:PointCJ = new PointCJ();
  190. var point2:PointCJ = new PointCJ();
  191. var i:int;
  192. var direction:int;
  193. if (m_found == true)
  194. {
  195. if (m_points[0].x < 384)
  196. {
  197. direction = 1;
  198. }
  199. else
  200. {
  201. direction = -1;
  202. }
  203. graph.lineStyle(2, 0x00ff00, 1);
  204. point1.x = m_points[0].x;
  205. point1.y = m_points[0].y;
  206. point1.y -= 4;
  207. point2.y = m_points[m_nbPoints - 1].y;
  208. point2.x = m_points[0].x;
  209. point2.y += 4;
  210. graph.moveTo( pointxOriginalToResize(point1.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(point1.y, origdimh, origdimv, resizeedimv));
  211. graph.lineTo( pointxOriginalToResize(point2.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(point2.y, origdimh, origdimv, resizeedimv));
  212. // graph.moveTo(point1.x, point1.y);
  213. // graph.lineTo(point2.x, point2.y);
  214. for (i = 0; i < m_nbPoints; i++)
  215. {
  216. if ((i == 0) || (i == m_nbPoints - 1))
  217. {
  218. graph.lineStyle(1, 0xf98d00, 1); // orange
  219. }
  220. else
  221. {
  222. graph.lineStyle(1, 0x00ff00, 1); // green
  223. }
  224. point1.x = m_points[i].x;
  225. point1.y = m_points[i].y;
  226. point2.x = m_points[i].x;
  227. point2.y = m_points[i].y;
  228. if ((i == 0) || (i == m_nbPoints - 1))
  229. {
  230. point1.x = m_points[0].x - 30;
  231. point2.x = m_points[0].x;
  232. }
  233. else
  234. {
  235. point1.x = m_points[0].x - 4;
  236. point2.x = m_points[0].x;
  237. }
  238. // graph.moveTo(point1.x, point1.y);
  239. // graph.lineTo(point2.x, point2.y);
  240. graph.moveTo( pointxOriginalToResize(point1.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(point1.y, origdimh, origdimv, resizeedimv));
  241. graph.lineTo( pointxOriginalToResize(point2.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(point2.y, origdimh, origdimv, resizeedimv));
  242. if ((i == 0) || (i == m_nbPoints - 1))
  243. {
  244. point2.y = m_points[i].y;
  245. point2.x = m_points[0].x;
  246. // graph.moveTo(point2.x, point2.y);
  247. graph.moveTo( pointxOriginalToResize(point2.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(point2.y, origdimh, origdimv, resizeedimv));
  248. point1.x = point2.x - 4;
  249. point1.y = point2.y - 4;
  250. // graph.lineTo(point1.x, point1.y);
  251. // graph.moveTo(point2.x, point2.y);
  252. graph.moveTo( pointxOriginalToResize(point1.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(point1.y, origdimh, origdimv, resizeedimv));
  253. graph.lineTo( pointxOriginalToResize(point2.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(point2.y, origdimh, origdimv, resizeedimv));
  254. point1.y = point2.y + 4;
  255. // graph.lineTo(point1.x, point1.y);
  256. graph.lineTo( pointxOriginalToResize(point1.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(point1.y, origdimh, origdimv, resizeedimv));
  257. }
  258. }
  259. }
  260. }
  261. public function distanceCalculation(pt1:PointCJ, pt2:PointCJ):Number
  262. {
  263. var dist:Number = new Number;
  264. dist = Math.sqrt(((pt2.x - pt1.x) * (pt2.x - pt1.x) + (pt2.y - pt1.y) * (pt2.y - pt1.y)));
  265. return dist;
  266. }
  267. // Calcul de l'échelle
  268. public function calculation(vImage:ImageCJ):int
  269. {
  270. var point1:PointCJ = new PointCJ();
  271. var point2:PointCJ = new PointCJ();
  272. var point3:PointCJ = new PointCJ();
  273. var i:int;
  274. var rep:int;
  275. var maxNg:int;
  276. var maxTotal:int;
  277. var deltax:int;
  278. var dwPos:int;
  279. var ng:int;
  280. var nPts:int;
  281. var saveDetection:Boolean;
  282. var detection:Boolean;
  283. var minPos:int;
  284. var maxPos:int;
  285. var color:uint;
  286. var red:uint;
  287. var green:uint;
  288. var blue:uint;
  289. var val:Number;
  290. var idx:int;
  291. var direction:int;
  292. var ng1:int;
  293. var ng2:int;
  294. var ng3:int;
  295. var ptClick0:PointCJ = new PointCJ();
  296. var ptClick1:PointCJ = new PointCJ();
  297. ptClick0.x = m_ptClick0.x;
  298. ptClick0.y = m_ptClick0.y;
  299. ptClick1.x = m_ptClick1.x;
  300. ptClick1.y = m_ptClick1.y;
  301. if (ptClick0.y > ptClick1.y)
  302. {
  303. point1.x = ptClick1.x;
  304. point1.y = ptClick1.y;
  305. ptClick1.x = ptClick0.x;
  306. ptClick1.y = ptClick0.y;
  307. ptClick0.x = point1.x;
  308. ptClick0.y = point1.y;
  309. }
  310. if (ptClick1.x < 384)
  311. {
  312. direction = 1;
  313. }
  314. else
  315. {
  316. direction = -1;
  317. }
  318. m_x1debug = ptClick1.x + 4 * direction;
  319. m_x2debug = ptClick1.x + 3 * direction;
  320. rep = -1;
  321. nPts = ptClick1.y - ptClick0.y;
  322. if (nPts > 2)
  323. {
  324. for (idx = ptClick1.x + 3 * direction; ((((direction == 1) && (idx < ptClick1.x + 6)) || ((direction == -1) && (idx > ptClick1.x - 6))) && (rep < 2)); idx+=direction)
  325. {
  326. for (i = 0; i < 512; i++)
  327. {
  328. m_points.x = 0;
  329. m_points.y = 0;
  330. }
  331. m_nbPoints = 0;
  332. m_found = false;
  333. var histogram:Array = new Array(1024);
  334. var mark:Array = new Array(1024);
  335. point2.x = idx;
  336. point2.y = ptClick1.y;
  337. for (i = 0; i < 1024; i++)
  338. {
  339. mark[i] = 0;
  340. histogram[i] = 0;
  341. }
  342. maxTotal = 0;
  343. for (dwPos = 0; dwPos < nPts; dwPos++)
  344. {
  345. point1.x = idx;
  346. point1.y = ptClick0.y + dwPos;
  347. point2.y = point1.y;
  348. // On prend la valeur maxi sur une largeur de 10 pixels à chaque point
  349. // Et sur une épaisseur de 3 pixels
  350. maxNg = 0;
  351. for (deltax = -5; deltax <= 5; deltax++)
  352. {
  353. point2.x = point1.x + deltax - 1;
  354. color = vImage.data.getPixel(point2.x, point2.y);
  355. red = color >> 16 & 0xFF;
  356. green = color >> 8 & 0xFF;
  357. blue = color & 0xFF;
  358. ng1 = ((red + green + blue) / 3);
  359. point2.x = point1.x + deltax;
  360. color = vImage.data.getPixel(point2.x, point2.y);
  361. red = color >> 16 & 0xFF;
  362. green = color >> 8 & 0xFF;
  363. blue = color & 0xFF;
  364. ng2 = ((red + green + blue) / 3);
  365. point2.x = point1.x + deltax + 1;
  366. color = vImage.data.getPixel(point2.x, point2.y);
  367. red = color >> 16 & 0xFF;
  368. green = color >> 8 & 0xFF;
  369. blue = color & 0xFF;
  370. ng3 = ((red + green + blue) / 3);
  371. ng = (ng1 + ng2 + ng3) / 3;
  372. if (ng > maxNg)
  373. {
  374. maxNg = ng;
  375. }
  376. if (ng > maxTotal)
  377. {
  378. maxTotal = ng;
  379. }
  380. }
  381. histogram[dwPos] = maxNg;
  382. }
  383. // Affiche les 2 points extrêmes que l'on a détecté
  384. saveDetection = false;
  385. rep = 0;
  386. for (i = 0; i < nPts; i++)
  387. {
  388. if (maxTotal >= 220)
  389. {
  390. // Cas standard où l'echelle se voit bien en blanc
  391. if (histogram[i] > 219)
  392. {
  393. detection = true;
  394. }
  395. else
  396. {
  397. detection = false;
  398. }
  399. }
  400. else
  401. {
  402. // Cas où les images ont une echelle ayant un éclairement plus faible
  403. if ((histogram[i] > (maxTotal - 50)) && (histogram[i] > 120))
  404. {
  405. detection = true;
  406. }
  407. else
  408. {
  409. detection = false;
  410. }
  411. }
  412. if (detection == true)
  413. {
  414. if (saveDetection == false)
  415. {
  416. minPos = i;
  417. saveDetection = true;
  418. }
  419. }
  420. else
  421. {
  422. if (saveDetection == true)
  423. {
  424. maxPos = i - 1;
  425. val = (maxPos + minPos) / 2.0;
  426. mark[rep] = Math.round(val);
  427. rep++;
  428. saveDetection = false;
  429. }
  430. }
  431. }
  432. for (i = 0; i < rep; i++)
  433. {
  434. point3.x = ptClick0.x;
  435. point3.y = ptClick0.y + mark[i];
  436. m_points[i].x = point3.x;
  437. m_points[i].y = point3.y;
  438. }
  439. if (rep > 1)
  440. {
  441. m_dblDistance = distanceCalculation(m_points[0], m_points[rep - 1]);
  442. m_found = true;
  443. m_nbPoints = rep;
  444. }
  445. else
  446. {
  447. m_found = false;
  448. }
  449. }
  450. }
  451. return rep;
  452. }
  453. private function clean(graph:Graphics, vSprite:Sprite):void
  454. {
  455. graph.clear();
  456. if (vSprite.numChildren)
  457. vSprite.removeChildAt(0);
  458. }
  459. // Dessine l'echelle superposée à l'image
  460. public function draw(origdimh:int, origdimv:int, resizeedimh:int, resizeedimv:int, graph:Graphics, vImage:ImageCJ, vSprite:Sprite):void
  461. {
  462. var vp1:PointCJ = new PointCJ();
  463. var vp2:PointCJ = new PointCJ();
  464. var sens:int;
  465. var startX:int;
  466. var startY:int;
  467. if ((m_nbPoints > 0) && (m_found == true))
  468. {
  469. if (m_points[0].x < 384)
  470. {
  471. sens = 1;
  472. }
  473. else
  474. {
  475. sens = -1;
  476. }
  477. this.clean(graph, vSprite);
  478. graph.lineStyle(2, 0x00ff00, 1); // vert
  479. // graph.moveTo(m_points[0].x, m_points[0].y);
  480. // graph.lineTo(m_points[m_nbPoints - 1].x, m_points[m_nbPoints - 1].y);
  481. graph.moveTo( pointxOriginalToResize(m_points[0].x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(m_points[0].y, origdimh, origdimv, resizeedimv));
  482. graph.lineTo( pointxOriginalToResize(m_points[m_nbPoints - 1].x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(m_points[m_nbPoints - 1].y, origdimh, origdimv, resizeedimv));
  483. graph.lineStyle(2, 0x00ff00, 1); // vert
  484. vp1.x = m_points[0].x;
  485. vp1.y = m_points[0].y;
  486. vp2.x = m_points[0].x;
  487. vp2.y = m_points[0].y;
  488. vp1.x -= 6;
  489. vp2.x += 6;
  490. // graph.moveTo(vp1.x, vp1.y);
  491. // graph.lineTo(vp2.x, vp2.y);
  492. graph.moveTo( pointxOriginalToResize(vp1.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(vp1.y, origdimh, origdimv, resizeedimv));
  493. graph.lineTo( pointxOriginalToResize(vp2.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(vp2.y, origdimh, origdimv, resizeedimv));
  494. vp1.x = m_points[m_nbPoints - 1].x;
  495. vp1.y = m_points[m_nbPoints - 1].y;
  496. vp2.x = m_points[m_nbPoints - 1].x;
  497. vp2.y = m_points[m_nbPoints - 1].y;
  498. vp1.x -= 6;
  499. vp2.x += 6;
  500. // graph.moveTo(vp1.x, vp1.y);
  501. // graph.lineTo(vp2.x, vp2.y);
  502. graph.moveTo( pointxOriginalToResize(vp1.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(vp1.y, origdimh, origdimv, resizeedimv));
  503. graph.lineTo( pointxOriginalToResize(vp2.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(vp2.y, origdimh, origdimv, resizeedimv));
  504. vp1.x = m_points[0].x;
  505. vp1.y = m_points[0].y;
  506. vp1.x -= 20;
  507. vp1.y = (m_points[m_nbPoints - 1].y + m_points[0].y) / 2 - 10;
  508. startX = pointxOriginalToResize(vp1.x, origdimh, origdimv, resizeedimh);
  509. startY = pointyOriginalToResize(vp1.y, origdimh, origdimv, resizeedimv);
  510. vp1.x = startX;
  511. vp1.y = startY;
  512. var format:TextFormat = new TextFormat();
  513. format.font = "Arial";
  514. format.color = 0xf98d00;
  515. format.size = 14;
  516. format.underline = false;
  517. format.bold = false;
  518. // Affiche la valeur de l'échelle sélectionnée
  519. m_label.text = m_length.toString();
  520. m_label.x = vp1.x;
  521. m_label.y = vp1.y;
  522. m_label.width = 40;
  523. m_label.height = 35;
  524. m_label.defaultTextFormat = format;
  525. m_label.setTextFormat(format);
  526. vSprite.addChild(m_label);
  527. }
  528. }
  529. }
  530. }