Obracanie grafiki WPF C#

Obracanie grafiki WPF C#
GE
  • Rejestracja:około 3 lata
  • Ostatnio:około 3 lata
  • Postów:6
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ć...

obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:dzień
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


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
edytowany 1x, ostatnio: obscurity
G1
  • Rejestracja:ponad 4 lata
  • Ostatnio:9 dni
  • Postów:506
0

Możesz użyć dp transform

lukaszek016
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad rok
  • Postów:249
1

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

Kopiuj
RenderTransformOrigin=".5,.5"
GE
  • Rejestracja:około 3 lata
  • Ostatnio:około 3 lata
  • Postów:6
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...

obscurity
pokaż kod. Jak obracasz parenta to nic w środku się nie powinno zmieniać / skalować. Obracaj ramkę, nie obrazek
GE
  • Rejestracja:około 3 lata
  • Ostatnio:około 3 lata
  • Postów:6
0

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

GE
  • Rejestracja:około 3 lata
  • Ostatnio:około 3 lata
  • Postów:6
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

obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:dzień
0

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

Kopiuj
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ń


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
edytowany 2x, ostatnio: obscurity
GE
  • Rejestracja:około 3 lata
  • Ostatnio:około 3 lata
  • Postów:6
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.

GE
  • Rejestracja:około 3 lata
  • Ostatnio:około 3 lata
  • Postów:6
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.