Obracanie grafiki WPF C#

0

Mam grafikę w ramce. Chciałbym obracać ją o 90, 180 i 270 stopni tak jak na załączonej grafice. RotatePictureBox.jpg
Grafika jest w środku ramki centrowana. Samo obracanie nie jest problemem (RotateTransform) ale obracanie z ramką i centrowanie zupełnie się rozjeżdża. Nie wstawiam kodu bo w zasadzie nie ma co... może jakieś przykłady, linki, gdzie szukać...

0

Wsadź sobie to w ViewBox i możesz sobie z tym robić co chcesz (skalować / obracać) bez rozjeżdżania. Jak dasz transform na parencie tej ramki z obrazkiem to też powinno w sumie działać normalnie

0

Możesz użyć dp transform

1

Spróbuj ustawić na obracanym elemencie przy użyciu RotateTransform:

RenderTransformOrigin=".5,.5"
0

Kiedy obraz jest umieszczony w PictureBox i skalowany/dopasowanyobracanie.jpg do jej wielkości obracanie w kwadracie działa ok, natomiast w prostokątnej ramce następuje przeskalowanie i obraz jest zmniejszany. Wymyśliłem ale jeszcze nie przetestowałem, żeby zmienić ramkę na kwadrat wg dłuższego boku, obrócić grafikę i dopiero wtedy przywrócić właściwe rozmiary. Może to będzie dobrym rozwiązaniem ? Przynajmniej grafika po obróceniu pozostanie we właściwym rozmiarze...

0

Wrzucę kawałek kodu wieczorem jak będę w domu...

0

Poniżej kod testowy na obecnym etapie i grafika która pokazuje jakie są efekty jego działania.

internal static FrameworkElement draw(EL_Graphics graphics, PrintingContext context)
{
var myImage = new Image();
myImage.Source = GetGraphicsSource(graphics, context); // - grafika pobierana z pliku
GUI_Utils.updateControlMargin(graphics, myImage);
myImage.Height = graphics.Height * CONSTS.POINT_TO_SCREEN_SCALE;
myImage.Width = graphics.Width * CONSTS.POINT_TO_SCREEN_SCALE;

myImage.HorizontalAlignment = HorizontalAlignment.Left;
myImage.VerticalAlignment = VerticalAlignment.Top;

// obracanie test----------------------------
double im_W = myImage.Width;
double im_H = myImage.Height;

if (myImage.Width > myImage.Height)
myImage.Height = myImage.Width;
else
myImage.Width = myImage.Height;

double centerX = (myImage.Height / 2);
double centerY = (myImage.Width / 2);
centerX = centerX - (graphics.Width / 2);
centerY = centerY - (graphics.Height / 2);

myImage.LayoutTransform = new RotateTransform(graphics.Rotate, centerX, centerY);

myImage.Width = im_W;
myImage.Height = im_H;
//---------------------------------------------

return myImage;
}

obracanie.jpg

0

Po co te kombinacje z rozmiarami? Wywal to i działa dobrze (sprawdzone):

var myImage = new Image();
var graphics = new BitmapImage(new Uri("https://picsum.photos/300/100"));
myImage.Source = graphics;
//GUI_Utils.updateControlMargin(graphics, myImage);
myImage.Height = 100;
myImage.Width = 300;

myImage.HorizontalAlignment = HorizontalAlignment.Left;
myImage.VerticalAlignment = VerticalAlignment.Top;

double centerX = myImage.Height / 2;
double centerY = myImage.Width / 2;

myImage.LayoutTransform = new RotateTransform(90, centerX, centerY);

Jak się coś nie podoba to zobacz w "live visual tree" do jakiego obiektu należy biała przestrzeń

0

@obscurity: dzięki, sprawdzę to później i dam znać. Kod działał dobrze na kwadratowej grafice więc pomyślałem, że może przed obrotem zrobić kwadrat a po obróceniu wrócić do rozmiarów wyjściowych - stąd te kombinacje. Czasem tak bywa, że logika wykłada się na prostych kwestiach. Pozdrawiam.

0

Działa! Dziękuję. Problem tkwił dodatkowo w innym fragmencie kodu ale poradziłem sobie. Obiekty są zdefiniowane w pliku XML i trzeba je było zsynchronizować z właściwościami Image.

1 użytkowników online, w tym zalogowanych: 0, gości: 1