| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640 |
- package com.imt.intimamedia.helpers
- {
- import flash.display.*;
- import flash.geom.Point;
- import flash.text.TextField;
- import flash.text.TextFormat;
-
- import mx.controls.Alert;
-
- // Added by Jdeppe march 2012
- // CJ suffix because first coder of Scale object (IMT V1) was Christophe Jacquelin
- // IMT Paris Opera district
- public class ScaleCJ
- {
- private var m_ptClick0:PointCJ = new PointCJ(); // Point du premier click souris
- private var m_ptClick1:PointCJ = new PointCJ(); // Point du 2ème click souris
-
- private var m_dblDistance:Number; // Distance en pixels entre les 2 points de l'échelle
-
- public var m_nbPoints:int; // Nombre de points de l'échelle
-
- [ArrayElementType("PointCJ")]
- public var m_points:Array = new Array(512);
-
- private var m_found:Boolean; // Une échelle a été détectée
-
- public var m_length:int; // Longueur Echelle
- private var m_label:TextField = new TextField();
-
- private var m_x1debug:int;
- private var m_x2debug:int;
-
- public function ScaleCJ()
- {
- var i:int;
-
- m_found = false;
- m_label.x = 0;
- m_label.y = 0;
- for (i = 0; i < 512; i++)
- {
- m_points[i] = new PointCJ();
- m_points.x = 0;
- m_points.y = 0;
- }
- m_nbPoints = 0;
-
- m_ptClick0.x = 0;
- m_ptClick0.y = 0;
- m_ptClick1.x = 0;
- m_ptClick1.y = 0;
- }
-
- public function getXFirstPoint() : int
- {
- return m_points[0].x;
- }
-
- public function getYFirstPoint() : int
- {
- return m_points[0].y;
- }
-
- public function getXLastPoint() : int
- {
- return m_points[m_nbPoints-1].x;
- }
-
- public function getYLastPoint() : int
- {
- return m_points[m_nbPoints-1].y;
- }
- public function setClickPoints(x1:int, y1:int, x2:int, y2:int):void
- {
- m_ptClick0.x = x1;
- m_ptClick0.y = y1;
- m_ptClick1.x = x2;
- m_ptClick1.y = y2;
- }
-
- public function setPoints(x1:int, y1:int, x2:int, y2:int):void
- {
- m_points[0].x = x1;
- m_points[0].y = y1;
-
- m_points[1].x = x2;
- m_points[1].y = y2;
- }
-
- public function setLength(length : int) : void
- {
- m_length = length;
- }
-
- public function getLength(): int
- {
- return m_length;
- }
-
- public function setNbPoints(nbPoints:int) : void
- {
- m_nbPoints = nbPoints;
- }
-
- public function setScaleFound(found:Boolean) : void
- {
- m_found = found;
- }
-
- public function setDistance(distance:Number) : void
- {
- m_dblDistance = distance;
- }
-
- public static function pointxOriginalToResize(x:int, oridimh:int, oridimv:int, resizedimh:int):int
- {
- var result:int;
- var ratio : Number;
- var newdimh : int;
- var newdimv : int;
- var y : int ;
-
- ratio = Number(oridimh) / Number(oridimv);
-
- if (ratio <= (4.0 / 3.0))
- {
- newdimv = oridimv;
- newdimh = int((4.0 * oridimv) / 3.0);
- }
- else
- {
- newdimh = oridimh;
- newdimv = int ((3.0 * oridimh) / 4.0);
- }
-
- if (newdimv >= oridimv)
- {
- // ------------
- //
- // ------------
- // xxxxxxxxxxxx
- // ------------
- //
- // ------------
- // x = x;
- x = x + ((newdimh - oridimh) / 2);
- y = y + ((newdimv - oridimv) / 2);
- }
- else if (newdimh >= oridimh)
- {
- // | | x | |
- // | | x | |
- // | | x | |
- // | | x | |
- // | | x | |
- // | | x | |
- // Alert.show("newdimh > dimh");
- x = x + ((newdimh - oridimh) / 2);
- y = y + ((newdimv - oridimv) / 2);
- // y = y;
- }
-
- x = (x * resizedimh) / newdimh;
-
- return x;
- }
-
- public static function pointyOriginalToResize(y:int, oridimh:int, oridimv:int, resizedimv:int ):int
- {
- var result:int;
- var ratio : Number;
- var newdimh : int;
- var newdimv : int;
- var x : int ;
-
- ratio = Number(oridimh) / Number(oridimv);
-
- if (ratio <= (4.0 / 3.0))
- {
- newdimv = oridimv;
- newdimh = int((4.0 * oridimv) / 3.0);
- }
- else
- {
- newdimh = oridimh;
- newdimv = int ((3.0 * oridimh) / 4.0);
- }
-
- if (newdimv >= oridimv)
- {
- // ------------
- //
- // ------------
- // xxxxxxxxxxxx
- // ------------
- //
- // ------------
- // x = x;
- x = x + ((newdimh - oridimh) / 2);
- y = y + ((newdimv - oridimv) / 2);
- }
- else if (newdimh >= oridimh)
- {
- // | | x | |
- // | | x | |
- // | | x | |
- // | | x | |
- // | | x | |
- // | | x | |
- // Alert.show("newdimh > dimh");
-
- x = x + ((newdimh - oridimh) / 2);
- y = y + ((newdimv - oridimv) / 2);
- // y = y;
- }
-
- y = (y * resizedimv) / newdimv;
-
- return y;
- }
-
- // Dessine l'échelle
- public function onDraw(origdimh:int, origdimv:int, resizeedimh:int, resizeedimv:int, graph:Graphics):void
- {
- var point1:PointCJ = new PointCJ();
- var point2:PointCJ = new PointCJ();
- var i:int;
- var direction:int;
- if (m_found == true)
- {
- if (m_points[0].x < 384)
- {
- direction = 1;
- }
- else
- {
- direction = -1;
- }
- graph.lineStyle(2, 0x00ff00, 1);
-
- point1.x = m_points[0].x;
- point1.y = m_points[0].y;
- point1.y -= 4;
-
- point2.y = m_points[m_nbPoints - 1].y;
- point2.x = m_points[0].x;
- point2.y += 4;
- graph.moveTo( pointxOriginalToResize(point1.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(point1.y, origdimh, origdimv, resizeedimv));
- graph.lineTo( pointxOriginalToResize(point2.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(point2.y, origdimh, origdimv, resizeedimv));
- // graph.moveTo(point1.x, point1.y);
- // graph.lineTo(point2.x, point2.y);
- for (i = 0; i < m_nbPoints; i++)
- {
- if ((i == 0) || (i == m_nbPoints - 1))
- {
- graph.lineStyle(1, 0xf98d00, 1); // orange
- }
- else
- {
- graph.lineStyle(1, 0x00ff00, 1); // green
- }
- point1.x = m_points[i].x;
- point1.y = m_points[i].y;
- point2.x = m_points[i].x;
- point2.y = m_points[i].y;
- if ((i == 0) || (i == m_nbPoints - 1))
- {
- point1.x = m_points[0].x - 30;
- point2.x = m_points[0].x;
- }
- else
- {
- point1.x = m_points[0].x - 4;
- point2.x = m_points[0].x;
- }
- // graph.moveTo(point1.x, point1.y);
- // graph.lineTo(point2.x, point2.y);
- graph.moveTo( pointxOriginalToResize(point1.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(point1.y, origdimh, origdimv, resizeedimv));
- graph.lineTo( pointxOriginalToResize(point2.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(point2.y, origdimh, origdimv, resizeedimv));
- if ((i == 0) || (i == m_nbPoints - 1))
- {
- point2.y = m_points[i].y;
- point2.x = m_points[0].x;
- // graph.moveTo(point2.x, point2.y);
- graph.moveTo( pointxOriginalToResize(point2.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(point2.y, origdimh, origdimv, resizeedimv));
-
- point1.x = point2.x - 4;
- point1.y = point2.y - 4;
-
- // graph.lineTo(point1.x, point1.y);
- // graph.moveTo(point2.x, point2.y);
- graph.moveTo( pointxOriginalToResize(point1.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(point1.y, origdimh, origdimv, resizeedimv));
- graph.lineTo( pointxOriginalToResize(point2.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(point2.y, origdimh, origdimv, resizeedimv));
- point1.y = point2.y + 4;
- // graph.lineTo(point1.x, point1.y);
- graph.lineTo( pointxOriginalToResize(point1.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(point1.y, origdimh, origdimv, resizeedimv));
- }
- }
- }
- }
-
- public function distanceCalculation(pt1:PointCJ, pt2:PointCJ):Number
- {
- var dist:Number = new Number;
-
- dist = Math.sqrt(((pt2.x - pt1.x) * (pt2.x - pt1.x) + (pt2.y - pt1.y) * (pt2.y - pt1.y)));
-
- return dist;
- }
-
- // Calcul de l'échelle
- public function calculation(vImage:ImageCJ):int
- {
- var point1:PointCJ = new PointCJ();
- var point2:PointCJ = new PointCJ();
- var point3:PointCJ = new PointCJ();
- var i:int;
- var rep:int;
- var maxNg:int;
- var maxTotal:int;
- var deltax:int;
- var dwPos:int;
- var ng:int;
- var nPts:int;
- var saveDetection:Boolean;
- var detection:Boolean;
- var minPos:int;
- var maxPos:int;
- var color:uint;
- var red:uint;
- var green:uint;
- var blue:uint;
- var val:Number;
- var idx:int;
- var direction:int;
- var ng1:int;
- var ng2:int;
- var ng3:int;
- var ptClick0:PointCJ = new PointCJ();
- var ptClick1:PointCJ = new PointCJ();
- ptClick0.x = m_ptClick0.x;
- ptClick0.y = m_ptClick0.y;
- ptClick1.x = m_ptClick1.x;
- ptClick1.y = m_ptClick1.y;
-
- if (ptClick0.y > ptClick1.y)
- {
- point1.x = ptClick1.x;
- point1.y = ptClick1.y;
- ptClick1.x = ptClick0.x;
- ptClick1.y = ptClick0.y;
- ptClick0.x = point1.x;
- ptClick0.y = point1.y;
- }
- if (ptClick1.x < 384)
- {
- direction = 1;
- }
- else
- {
- direction = -1;
- }
-
- m_x1debug = ptClick1.x + 4 * direction;
- m_x2debug = ptClick1.x + 3 * direction;
-
- rep = -1;
- nPts = ptClick1.y - ptClick0.y;
- if (nPts > 2)
- {
- for (idx = ptClick1.x + 3 * direction; ((((direction == 1) && (idx < ptClick1.x + 6)) || ((direction == -1) && (idx > ptClick1.x - 6))) && (rep < 2)); idx+=direction)
- {
- for (i = 0; i < 512; i++)
- {
- m_points.x = 0;
- m_points.y = 0;
- }
-
- m_nbPoints = 0;
-
- m_found = false;
-
- var histogram:Array = new Array(1024);
- var mark:Array = new Array(1024);
-
- point2.x = idx;
- point2.y = ptClick1.y;
-
- for (i = 0; i < 1024; i++)
- {
- mark[i] = 0;
- histogram[i] = 0;
- }
-
- maxTotal = 0;
- for (dwPos = 0; dwPos < nPts; dwPos++)
- {
- point1.x = idx;
- point1.y = ptClick0.y + dwPos;
-
- point2.y = point1.y;
- // On prend la valeur maxi sur une largeur de 10 pixels à chaque point
- // Et sur une épaisseur de 3 pixels
- maxNg = 0;
-
- for (deltax = -5; deltax <= 5; deltax++)
- {
- point2.x = point1.x + deltax - 1;
- color = vImage.data.getPixel(point2.x, point2.y);
- red = color >> 16 & 0xFF;
- green = color >> 8 & 0xFF;
- blue = color & 0xFF;
- ng1 = ((red + green + blue) / 3);
-
- point2.x = point1.x + deltax;
- color = vImage.data.getPixel(point2.x, point2.y);
- red = color >> 16 & 0xFF;
- green = color >> 8 & 0xFF;
- blue = color & 0xFF;
- ng2 = ((red + green + blue) / 3);
-
- point2.x = point1.x + deltax + 1;
- color = vImage.data.getPixel(point2.x, point2.y);
- red = color >> 16 & 0xFF;
- green = color >> 8 & 0xFF;
- blue = color & 0xFF;
- ng3 = ((red + green + blue) / 3);
-
- ng = (ng1 + ng2 + ng3) / 3;
-
- if (ng > maxNg)
- {
- maxNg = ng;
- }
-
- if (ng > maxTotal)
- {
- maxTotal = ng;
- }
- }
-
- histogram[dwPos] = maxNg;
- }
-
- // Affiche les 2 points extrêmes que l'on a détecté
- saveDetection = false;
- rep = 0;
- for (i = 0; i < nPts; i++)
- {
- if (maxTotal >= 220)
- {
- // Cas standard où l'echelle se voit bien en blanc
- if (histogram[i] > 219)
- {
- detection = true;
- }
- else
- {
- detection = false;
- }
- }
- else
- {
- // Cas où les images ont une echelle ayant un éclairement plus faible
- if ((histogram[i] > (maxTotal - 50)) && (histogram[i] > 120))
- {
- detection = true;
- }
- else
- {
- detection = false;
- }
- }
-
- if (detection == true)
- {
- if (saveDetection == false)
- {
- minPos = i;
- saveDetection = true;
- }
- }
- else
- {
- if (saveDetection == true)
- {
- maxPos = i - 1;
- val = (maxPos + minPos) / 2.0;
- mark[rep] = Math.round(val);
- rep++;
- saveDetection = false;
- }
- }
- }
-
- for (i = 0; i < rep; i++)
- {
- point3.x = ptClick0.x;
- point3.y = ptClick0.y + mark[i];
- m_points[i].x = point3.x;
- m_points[i].y = point3.y;
- }
-
- if (rep > 1)
- {
- m_dblDistance = distanceCalculation(m_points[0], m_points[rep - 1]);
- m_found = true;
- m_nbPoints = rep;
- }
- else
- {
- m_found = false;
- }
- }
- }
-
- return rep;
- }
-
- private function clean(graph:Graphics, vSprite:Sprite):void
- {
- graph.clear();
- if (vSprite.numChildren)
- vSprite.removeChildAt(0);
- }
-
- // Dessine l'echelle superposée à l'image
- public function draw(origdimh:int, origdimv:int, resizeedimh:int, resizeedimv:int, graph:Graphics, vImage:ImageCJ, vSprite:Sprite):void
- {
- var vp1:PointCJ = new PointCJ();
- var vp2:PointCJ = new PointCJ();
- var sens:int;
- var startX:int;
- var startY:int;
- if ((m_nbPoints > 0) && (m_found == true))
- {
- if (m_points[0].x < 384)
- {
- sens = 1;
- }
- else
- {
- sens = -1;
- }
-
- this.clean(graph, vSprite);
- graph.lineStyle(2, 0x00ff00, 1); // vert
-
- // graph.moveTo(m_points[0].x, m_points[0].y);
- // graph.lineTo(m_points[m_nbPoints - 1].x, m_points[m_nbPoints - 1].y);
- graph.moveTo( pointxOriginalToResize(m_points[0].x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(m_points[0].y, origdimh, origdimv, resizeedimv));
- graph.lineTo( pointxOriginalToResize(m_points[m_nbPoints - 1].x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(m_points[m_nbPoints - 1].y, origdimh, origdimv, resizeedimv));
-
- graph.lineStyle(2, 0x00ff00, 1); // vert
-
- vp1.x = m_points[0].x;
- vp1.y = m_points[0].y;
- vp2.x = m_points[0].x;
- vp2.y = m_points[0].y;
-
- vp1.x -= 6;
- vp2.x += 6;
-
- // graph.moveTo(vp1.x, vp1.y);
- // graph.lineTo(vp2.x, vp2.y);
- graph.moveTo( pointxOriginalToResize(vp1.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(vp1.y, origdimh, origdimv, resizeedimv));
- graph.lineTo( pointxOriginalToResize(vp2.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(vp2.y, origdimh, origdimv, resizeedimv));
-
- vp1.x = m_points[m_nbPoints - 1].x;
- vp1.y = m_points[m_nbPoints - 1].y;
-
- vp2.x = m_points[m_nbPoints - 1].x;
- vp2.y = m_points[m_nbPoints - 1].y;
-
- vp1.x -= 6;
- vp2.x += 6;
-
- // graph.moveTo(vp1.x, vp1.y);
- // graph.lineTo(vp2.x, vp2.y);
- graph.moveTo( pointxOriginalToResize(vp1.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(vp1.y, origdimh, origdimv, resizeedimv));
- graph.lineTo( pointxOriginalToResize(vp2.x, origdimh, origdimv, resizeedimh), pointyOriginalToResize(vp2.y, origdimh, origdimv, resizeedimv));
-
- vp1.x = m_points[0].x;
- vp1.y = m_points[0].y;
-
- vp1.x -= 20;
-
- vp1.y = (m_points[m_nbPoints - 1].y + m_points[0].y) / 2 - 10;
- startX = pointxOriginalToResize(vp1.x, origdimh, origdimv, resizeedimh);
- startY = pointyOriginalToResize(vp1.y, origdimh, origdimv, resizeedimv);
-
- vp1.x = startX;
- vp1.y = startY;
-
- var format:TextFormat = new TextFormat();
- format.font = "Arial";
- format.color = 0xf98d00;
- format.size = 14;
- format.underline = false;
- format.bold = false;
-
- // Affiche la valeur de l'échelle sélectionnée
- m_label.text = m_length.toString();
- m_label.x = vp1.x;
- m_label.y = vp1.y;
- m_label.width = 40;
- m_label.height = 35;
- m_label.defaultTextFormat = format;
- m_label.setTextFormat(format);
-
- vSprite.addChild(m_label);
- }
- }
- }
- }
|