Zamiana Pixeli na Milimetry

0

Witam,

Na płótnie Canvas potrzebuje narysować np. linię, oczywiście linia ma określone współrzędne x1, x2, y1, y2.
Potrzebuje aby te współrzędne określać w milimetrach, tak aby po eksportowaniu płótna do pliku PNG i wydrukowaniu odzwierciedlało się to w rzeczywistym rozmiarze. Zakres musi być dokładny do około 1 metra.

Rysując linie równolegle do osi ekranu o parametrach określających długość linii: 100
Mnożę tą wartość przez: 96/25.4 (tak jak to znalazłem na pewnym forum)
Po wyeksportowaniu płótna do pliku PNG i wydrukowaniu wartość zamiast 10 cm wynosi około 8,9 cm

W czym tkwi problem:
Zła konwersacja jednostki?
Złe eksportowanie płótna do pliku PNG, za czym idzie zmiana prawidłowego rozmiaru?

0

Np. http://stackoverflow.com/questions/7722809/print-in-net-conversion-from-millimeter-to-pixel - dla ekranu 96dpi, dla drukarki 100dpi... Musisz znać fizyczne rozmiary ekranu, żeby móc prawidłowo przeskalować px do mm, bo co z tego, że założysz że dpi dla ekranu to 96dpi, kiedy ktoś zmieni rozdzielczość albo będzie mieć nietypowy ekran. Z drukarką trochę prościej, bo gęstość (dpi) łatwo odczytasz, a wymiary możesz sobie założyć - np. A4 - lub sczytasz z ustawień drukarki.

0

Po wyeksportowaniu płótna do pliku PNG i wydrukowaniu wartość zamiast 10 cm wynosi około 8,9 cm
Wydrukowaniu w czym?

Bo co z tego że ty sobie dobrze przeliczysz, jak program drukujący wcale nie musi respektować ustawionego dpi, i zrobi sobie własne powiększenie obrazka na kartce.

0

Zmieniłem troszkę funkcjonalność i zamiast eksportować canvas do PNG drukuję całą zawartość płótna bezpośrednio z programu używając domyślnej drukarki.
Przeliczyłem poprawnie dpi i drukowany obrazek ma prawidłowy rozmiar.

Problem jest teraz taki że do mojego płótna potrzebuję załadować kilka obrazków.
Do tej pory załadowałem jeden obraz jako tło płótna z parametrem Stretch.none
co ustawiało moje płótno na rozmiar dokładnie taki jaki posiada rozmiar obrazek,
jednak potrzebuje wyświetlić moje obrazki na płótnie, a nie jako jego tło.

Podejrzewam, że trzeba cały obrazek przerysować na płótno, ale jak?

Próbowałem stworzyć obiekt Image i dodać go do płótna jako Children ale to nie działa.

            Image imageB = new Image();
            imageB.Source = new BitmapImage(new Uri(@"Fonts\Avant\asd.png", UriKind.Relative));
            canvas.Children.Add(imageB);

Zauważyłem że wstawiając w XAML, image wstawia się poprawnie, jednak po uruchomieniu jest białe tło.
Czym to jest spowodowane?

<Canvas Name="Temp" Grid.Column="1" Background="White" HorizontalAlignment="Left" Height="505" Margin="30,50,0,0" VerticalAlignment="Top" Width="550">
            <Image Source="bin/Debug/Fonts/Avant/asd.sys" />
        </Canvas>

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