2012-04-05 2 views
0

Я рисую подпись, подобную этой, как указано ниже, и беру X Y cordinate и сохраняя ее в списке arry.Необходимо преобразовать файл изображения в формат координат X Y

Bitmap bmp; 

     //Graphics object 
     Graphics graphics; 

     //Pen object 
     Pen pen = new Pen(Color.Black); 

     // Array List of line segments 
     ArrayList pVector = new ArrayList(); 

     //Point object 
     Point lastPoint = new Point(0, 0); 

protected override void OnMouseDown(MouseEventArgs e) 
     { 
      base.OnMouseDown(e); 

      // process if currently drawing signature 
      if (!drawSign) 
      { 
       // start collecting points 
       drawSign = true; 

       // use current mouse click as the first point 
       lastPoint.X = e.X; 
       lastPoint.Y = e.Y; 
      } 

     } 

protected override void OnMouseMove(MouseEventArgs e) 
     { 
      base.OnMouseMove(e); 

      // process if drawing signature 
      if (drawSign) 
      { 
       if (graphics != null) 
       { 
        // draw the new segment on the memory bitmap 
        graphics.DrawLine(pen, lastPoint.X, lastPoint.Y, e.X, e.Y); 
        pVector.Add(lastPoint.X + " " + lastPoint.Y + " " + e.X + " " + e.Y); 

        // update the current position 
        lastPoint.X = e.X; 
        lastPoint.Y = e.Y; 

        // display the updated bitmap 
        Invalidate(); 
       } 
      } 
     } 

Использование arrylist (pVector) Я спасаю значения в базе данных в виде строки (singature) и так же, как изображение, как показано ниже

//Saving value to Database 
ArrayList arrSign = new ArrayList(); 
       arrSign = this.signatureControl.getPVector(); 

       string singature = ""; 

       for (int i = 0; i < arrSign.Count; i++) 
       { 
        singature = singature + arrSign[i].ToString() + "*"; 
       } 


the string singature wiil be like this 
60 46 59 48*59 48 59 51*59 51 59 53*59 53 60 49*60 49 61 44*61 44 62 38*62 38 64 31*64 31 67 23*67 23 70 14*70 14 72 10*72 10 75 3*75 3 77 -2*77 -2 76 2*76 2 75 6*75 6 72 17*72 17 71 24*71 24 69 31*69 31 68 46*68 46 67 59*67 59 68 71*68 71 69 79*69 79 70 86*70 86 71 89*71 89 71 93*71 93 71 95*71 95 71 97*71 97 70 95*70 95 69 88*69 88 68 81*68 81 69 77*69 77 69 68*69 68 71 60 

//Saving as Image file 

    Pen pen = new Pen(Color.Black); 
           string[] arrStr = (signature.Split('*')); 

           Graphics graphics; 
           Bitmap bmp = new Bitmap(300, 200); 

           graphics = Graphics.FromImage(bmp); 
           graphics.Clear(Color.White); 

           for (int i = 0; i < arrStr.Length - 2; i++) 
           { 
            string[] strArr = new string[4]; 
            strArr = ((arrStr[i].ToString()).Split(' ')); 
            graphics.DrawLine(pen, Convert.ToInt32(strArr[0].ToString()), Convert.ToInt32(strArr[1].ToString()), 
             Convert.ToInt32(strArr[2].ToString()), Convert.ToInt32(strArr[3].ToString())); 
           } 

           string pathToCopyImage = systemBus.TempFile; 

           bmp.Save(pathToCopyImage + "\\" + dsReportDetails.Tables["tblDelivery"].Rows[0]["PKDelivery"].ToString() + "_Signature.bmp", System.Drawing.Imaging.ImageFormat.Bmp); 
           bmp.Dispose(); 

Моя проблема заключается в том, что после сохранения подписи как изображения file Я не могу преобразовать его обратно в arrylist, как тот, который я использовал для сохранения значения в базе данных. т.е. мне нужно преобразовать файл изображения обратно, как указано ниже формата

60 46 59 48*59 48 59 51*59 51 59 53*59 53 60 49*60 49 61 44*61 44 62 38*62 38 64 31*64 31 67 23*67 23 70 14*70 14 72 10*72 10 75 3*75 3 77 -2*77 -2 76 2*76 2 75 6*75 6 72 17*72 17 71 24*71 24 69 31*69 31 68 46*68 46 67 59*67 59 68 71*68 71 69 79*69 79 70 86*70 86 71 89*71 89 71 93*71 93 71 95*71 95 71 97*71 97 70 95*70 95 69 88*69 88 68 81*68 81 69 77*69 77 69 68*69 68 71 60 

Будет ли один помочь мне, пожалуйста

ответ

0

Это не очень легко получить «строку подписи» назад от изображения, так что вы можете просто добавьте «строчную подпись» к сохраненному изображению в качестве тега метаданных изображения (например, в описании). Итак, вы читаете свое изображение назад, вам не нужно распознавать «строку подписи» из изображения, вы можете просто прочитать его из метаданных в виде строки. В Msdn есть хорошая статья о метаданных изображений и api для работы с ними. http://msdn.microsoft.com/en-us/library/ms748873.aspx

Кстати, ваш код для конкатенации «строки подписи» медленный и потребляющий память. Лучше использовать StringBuilder в таких ситуациях в .Net. И общие строки не являются лучшей структурой данных для хранения списка точек. Но это зависит от требований к вашему приложению.

Смежные вопросы