2013-09-24 2 views
0

Я сегодня все выгляжу ТАКОЙ, и я не могу заставить ничего работать для моих нужд.Изображение, движущееся, результирующее изображение непредсказуемо

У меня есть веб-приложение, которое позволяет пользователям перетаскивать текст/изображения, а затем отправляет детали на сервер, чтобы нарисовать их в pdf. Я пытаюсь включить ротацию, но я не могу уловить материал translateetransform. Мое изображение при тестировании печатается отлично, хорошо вращается, но оно не в правильном месте. Мне не хватает того, как intitial translatetransform меняет вещи, и мой ум выстреливается в конце дня. Нужно ли сначала рисовать это как растровое изображение с использованием другого графического экземпляра, а затем нарисовать это растровое изображение на моем фоне? Любая помощь в этом была бы замечательной! Благодаря!

КОД:

  • я это изображение объект из браузера
  • коорда является й & у верхнего угла изображения на холсте (990wx1100h) на браузере
  • размера является ч & мас элемента в браузере

         Bitmap b = new Bitmap(wc.OpenRead(i.img)); 
             if (i.rotation != 0) 
             { 
              g.TranslateTransform(this.CanvasDetails.size.width/2, this.CanvasDetails.size.height/2); 
              g.RotateTransform(i.rotation); 
              g.DrawImage(b, new Rectangle(- i.coord.x/2, -i.coord.y/2, i.size.width, i.size.height), 0, 0, b.Width, b.Height, GraphicsUnit.Pixel, ia); 
             } 
             else 
             { 
              g.DrawImage(b, new Rectangle(i.coord.x, i.coord.y, i.size.width, i.size.height), 0, 0, b.Width, b.Height, GraphicsUnit.Pixel, ia); 
             } 
    

    EDIT Я добавил преобразование переводов, как было предложено Адамом, но изображение по-прежнему рисуется в другом месте.

           g.TranslateTransform(this.CanvasDetails.size.width/2, this.CanvasDetails.size.height/2); 
              g.RotateTransform(i.rotation); 
              g.TranslateTransform(-this.CanvasDetails.size.width/2, -this.CanvasDetails.size.height/2); 
              g.DrawImage(b, new Rectangle(-i.coord.x/2, -i.coord.y/2, i.size.width, i.size.height), 0, 0, b.Width, b.Height, GraphicsUnit.Pixel, ia); 
    

Примеры: Browser View Browser View

.NET обращается версия Server Side Product

ответ

1

Ok, полностью переработав этот ответ, чтобы попытаться объяснить это понятнее. Несколько вещей, которые нужно знать, - это то, что трансформации «накапливаются» и трансформации вращения происходят вокруг начала координат. Таким образом, чтобы просто объяснить аффект накопления (умножения) трансформирует, посмотрите на этот пример:

  //draw an ellipse centered at 200,200 
      g.DrawEllipse(Pens.Red, 195, 195, 10, 10); 

      //apply translate transform - shifts origin to 200,200 
      g.TranslateTransform(200, 200); 

      //draw another ellipse, should draw around first ellipse 
      //because translate tranforms essentially moves our coordinates 200,200 
      g.DrawEllipse(Pens.Blue, -7, -7, 14, 14); 

      //now do rotate transform 
      g.RotateTransform(90f); //degree to rotate object 

      //now, anything we draw with coordinates 0,0 is actually going to be draw at 200,200 AND be rotated by 45* 
      //this line will be vertical, through 200,200, instead of horizontal through 0,0 
      g.DrawLine(Pens.Green, -20,0,20,0); 

      //If we add another translate, this time 50x, it would normally translate by 50 in the X direction 
      //BUT - because we already have transforms applied, including the 90 rotate, it affects this translation 
      //so this in effect because a 50px translation in Y, because it's rotated 90* 
      g.TranslateTransform(50, 0); 

      //so even though we translated 50x, this line will draw 50px below the last line 
      g.DrawLine(Pens.Green, -20, 0, 20, 0); 

Так что для вашего дела, вы хотите нарисовать объект с центром в Centerpoint и повернутый на угол. Так что вы могли бы сделать:

g.TranslateTransform(-CenterPoint.X, -CenterPoint.Y); 
g.RotateTransform(Angle); 
g.DrawImage(b, -ImageSize/2, -ImageSize/2, ImageSize, ImageSize); 

Вы бы тогда нужно сбросить преобразования для дополнительной графики, которые вы можете сделать с:

g.ResetTransform(); 

Если это не оставляет изображение, где вы хотите его , то вам нужно будет проверить значения, которые вы используете, чтобы разместить его. Вы храните его в центре? Или вверху слева? И т.д.

+0

К сожалению, это не сработало. «CanvasDetails» - это фон, на который я рисую изображение. Я действительно смущен. Должен ли я использовать drawimage с прямоугольником или нет? Я понятия не имею, как это сделать. – user576838

+0

Не могли бы вы поместить немного больше своего кода и лучший пример того, чем отличается ваш веб-сайт и .net? Вероятно, это проблема с несколькими преобразованиями, но без дополнительного кода трудно точно увидеть, что именно – Adam

+0

Спасибо за подробности, я попробую это сейчас и посмотрю, что я могу сделать для работы. Я очень ценю дополнительную информацию! Благодаря! – user576838

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