Hi Leute
Ich hab nun noch etwas rumexperimentiert und dabei ist mir aufgefallen, dass Bilder ähnlich verschwommen angezeigt werden wie Texte.
Bei Texten kann man es ja ignorieren, weil es auf den meisten Monitoren gut aus sieht, aber was wenn das Bild unbedingt so aussehen muss wie Original?
Ist es auch möglich ein Bild in Originalgröße mit originalen Pixeln anzeigen zu lassen?
edit: ich habe das Bild als BitmapImage in einem ImageDrawing in einem DrawingImage anzeigen lassen
Keine Lösung, aber ein ähnliches Problem. Vielleicht hat ja jemand eine Idee oder einen Link.
Ich habe festgestellt, dass das "MediaElement" in Videos immer einen gewissen Grauschleier hat - weiße Flächen sind also niemals weiß, sondern eben grau. Und das auf mehreren verschiedenen Rechnern (also keine lokale Anomalie). Gar nicht schön.
nehmts mir nicht übel, dass ich mal pushe.
Aber das Thema müsste doch jeden betreffen?
Ich meine, selbst wenn es bei euch gut aussieht, ist es Hardwareabhängig bei anderen ungleich schlechter.
Das kann doch nicht sein, dass es nicht möglich ist ein Bild korrekt anzeigen zu lassen?
Es ist mir übrigens schon klar, warum die Bilder unscharf sind - und, dass das nicht der Fall ist, wenn man die Bilder absolut positionieren lässt(also ganze Pixelwerte hat), aber das ist ja unmöglich aufrecht zu erhalten
Keine Ahnung, ob´s was bringt, aber hast du mal versucht, "SnapsToDevicePixels" auf true zu setzen?
Hehe, bin, wirklich zufällig, in unserem Projekt genau an das gleiche Problem gestoßen... Ja, dieses SnapDings nützt wirklich nichts und ich sehe auch gar keinen Unterschied bzw. weiß gar nicht, ob das funktioniert oder ob das zu irgendetwas nützlich ist.
Aber das mit der unscharfen Schrift nervt mich schon länger. Sieht furchtbar aus, ist aber im WPF-Konzept wohl nicht anders umzusetzen.
naja, Schrift ist hässlich, aber mehr auch nicht, da ich aber die Bilder bearbeiten lassen möchte, muss da schon jeder Pixel stimmen...
Ich finde das ganze Vektorbasierende Prinzip von WPF unschön. Es ist mir egal wie das nach einer vergrößerung aussieht, wichtig ist mir zunächst mal, dass das angezeigt wird, was ich will das angezeigt wird ...
OK, ich sehe gerade, dass mein Bild verzerrt war, er macht sich also nichts aus "Stretch="None""
Habe also mal die originalen Width und Height angegeben, jetzt sieht es einigermaßen ok aus.
joa, aber auch nur einigermaßen ^^
Das liegt daran, dass durch das Vektorsystem die Bilder auch zwischen den Pixeln liegen und das dann anti-aliased aussieht(kennst du das Problem mit a-a irgendwoher? g).
Ich brauchs aber exakt :X Dazu müssen die Bilder auf ganzen Pixelzahlen positioniert sein, und das geht nur im Canvas und auch nur, wenn man das Fenster nicht vergrößert, und das ist untragbar.
Kann man die auch noch anders absolut positionieren und absolut positioniert lassen?
Du kannst egal wo in WPF, nicht von dir aus pixelgenau positionieren. Auch die Angaben im Canvas sind device independent Units. Um aber genau das zu erreichen dass die WPF Pixel auf den physikalischen liegen, gibts das SnapsToDevicePixels.
Baka wa shinanakya naoranai.
Mein XING Profil.
Glaub ich net unbedingt. Ich hatte mir auch schon nen einfachen Bildbetrachter geschrieben, der vollkommen in Ordnung war und die Bilder waren immer so wie ich sie aus anderen Programmen gewohnt war. Nur mit der Schrift stimm ich schon, die ist nicht immer optimal.
Baka wa shinanakya naoranai.
Mein XING Profil.
Dass sie bei dir vollkommen in Ordnung waren ist vermutlich genau so hardwareabhängig, wie die Schriftanzeige(die ist bei mir die Schlimmste, die ich je gesehen hab, hab auch schon bei ICQ jede Menge Leute belästigt, weil ich einen Durchschnittswert haben wollte)
falls publik kannst du ja mal deinen Bildbetrachter posten und ich guck mal ob das bei mir scharf oder so verschwommen wie bei mir ist?
[Artikel] Einführung in die WPF(Windows Presentation Foundation) - aktuell Teil 3: Beispielanwendung
Der Download funktioniert nicht mehr aber du brauchst nur den XAML Code am Anfang des Artikels und die beiden Funktionen die eher am Ende stehen und das wars. Habs grad nochmal am laufen und kann absolut keine Schwierigkeiten feststellen. Vielleicht kannst du ja auch mal ne kleine Beispielanwendung schreiben die net gut aussieht und mal posten.
Baka wa shinanakya naoranai.
Mein XING Profil.
OK, mach ich, aber da du die Bilder sowieso vergrößerst und verkleinerst werden die Pixel sowieso verändert und der Unterschied ist minimal.
Es ist ja nur kritisch, weil ich alles original brauche...
Es ist auch scharf, solange es auf einer integralen Pixelposition steht, was mit SnapToDevicePixel irgendwie nicht funktioniert nur das ändert sich ja, wenn die Fenstergröße verändert wird.
Aber genug der Worte, ich lasse mal Bilder und Code sprechen, zunächst 2 Bilder, oben scharf unten drunter unscharf(ich habe mal das Bild des WPF Texttestes genommen, weil das gerade auf meinem Desktop war)
Für Bearbeitung des Bildes, seis auch nur zusammenschneiden, natürlich nicht akzeptabel...
Es fällt auch auf, dass der normale Text nach dem er als Bild angezeigt wurde genau so aussieht, wie der Text der zu Beginn als WPF Text angezeigt wurde.
OK, der Code dazu ist simpel und war auch einfach mal schnell gemacht um es zu testen:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfLernApp
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
BitmapImage bi = new BitmapImage(new Uri(System.Windows.Forms.Application.StartupPath + @"\Texte.PNG"));
drawing.Drawing = new ImageDrawing(bi, new Rect(0, 0, 296, 290));
}
}
}
<Window x:Class="WpfLernApp.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:this="clr-namespace:WpfLernApp"
Title="Window1" Height="500" Width="500">
<Grid MinWidth="296" MinHeight="290" MaxWidth="296" MaxHeight="290">
<Image SnapsToDevicePixels="True">
<Image.Source>
<DrawingImage x:Name="drawing"/>
</Image.Source>
</Image>
</Grid>
</Window>
das Grid ist bereits auf die größen des Bildes abgestimmt, das Bild verschiebt sich nur, die Größe bleibt gleich.
Und im Anhang das ganze Projekt, was sich aber außer der Standardimplementation von Application nicht vom Code unterscheidet
Ja, aber selbst durch des skalieren verändert sich nichts an der "Schärfe" des Bildes, hab deine Code auch probiert mit deinem Textbild, und auch nen Bild von mir was ich nicht skaliert habe und trotzdem ist alles ganz normal scharf.
Was ich aber net verstehe ist, warum du über nen DrawingImage und ImageDrawing gehst, ist doch völlig unnötig. Des nimmt man wenn mal lowlevel zeichnet, aber idR. nicht um einfach Bilder anzuzeigen. Wenns dir darum geht die Größe des Bildes anzupassen kannst einfach folgenden Code verwenden.
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.DecodePixelWidth = 500;
bi.DecodePixelHeight = 500;
bi.UriSource = new Uri(System.Windows.Forms.Application.StartupPath + @"\912.gif");
bi.EndInit();
img.Source = bi;
wobei img bei mir jetzt das Image Control ist. Wenn du es nicht skalieren willst musst du die DecodePixelXXX net angeben, die sind aber vorteilhaft wenn man viele Bilder lädt, zum Beispiel als relativ kleine Thumbnails. Da kann man dann nämlich z.B. die Thumbnailgröße angeben, und die Bilder werden wirklich in dieser kleinen Größe geladen und nicht in ihrer Ursprungsgröße was natürlich en Menge Platz im RAM spart bei vielen Bildern.
Was ich auch rumprobiere, bei mir wird nie was unscharf.
Baka wa shinanakya naoranai.
Mein XING Profil.
Was ich auch rumprobiere, bei mir wird nie was unscharf.
Ist aber nicht bei mir so, vermutlich wie die Schrift Hardwareabhängig:
http://blogs.msdn.com/seema/archive/2006/11/07/why-do-my-bitmaps-look-blurry-by-anthony-hodsdon-miles-cohen.aspx
Was ich aber net verstehe ist, warum du über nen DrawingImage und ImageDrawing gehst, ist doch völlig unnötig. Des nimmt man wenn mal lowlevel zeichnet, aber idR. nicht um einfach Bilder anzuzeigen.
Ich habe das ja genommen, weil ich die Bilder bearbeiten wollte, deswegen will ich ja auch die Schärfe haben.
Ist aber nicht bei mir so, vermutlich wie die Schrift Hardwareabhängig:
Was hast Du denn für Hardware? Hast Du es auf anderer Hardware schon probiert? Bringt ein Update des Treibers etwas? Hast Du schon verschiedene Treibereinstellungen probiert?
Mal noch ne andere Frage. Wie ist denn deine native Auflösung deines Bildschirms und die DPI Zahl, und welche hast du in Windows eingestellt?
Baka wa shinanakya naoranai.
Mein XING Profil.
1280 * 800 sowohl nativ als auch eingestellt
und ich hab 96 DPI eingestellt.
Ich hol den Thread ungern rauf, aber ich steh da vor einem ziemlich großem Problem.
Ich habe ein Control gebaut, in dem ein Grid und die drei Standard-Buttons sind, dieses Control verwende ich in einem TabItem.Content ein paar mal.
Nun variiert die Schärfe der Buttons.
(Siehe Bild)
Das ist mein Code für das Image des Buttons:
<Image Source="../Images/icoAdd.gif" Width="16" Height="16"></Image>
Das Bild liegt als 16x16 gif auf der Festplatte, kann ich da irgendwie verhindern, dass das so unscharf gerendert wird?
ohne jetzt alles gelesen zu haben
bei dem code ton talla sieht man es sehr gut
"DecodePixelWidth"
"DecodePixelHeight"
das schon gesetzt ?
das Image hat keine solchen Properties ... und ich hab echt keine Lust jedes Image mit dem gezeigten Code manuell zu setzen.
das problem ist - du kannst den string zu dem bild nur im Source in der xaml setzen da es ein entsprechenden type converter gibt, dieser converter uebernimmt diese arbeit
was auch eine moeglichkeit waere ein eigenen typeconverter zu basteln der ein string zu einem bitmapimage convertiert
gibst du den buttons feste groessen oder hast du nur ein padding eingestellt?
gibst du den buttons feste groessen oder hast du nur ein padding eingestellt?
nur Margin = "0 0 5 0" damit die Buttons nicht aneinander kleben, sonst nur Standardwerte.
stell mal testweise bei dem image SnapToDevicePixelt auf True - wirds dann besser?
(kannst ja zwei identische buttons nebeneinander stellen und eines true das andere false
obs was bringt Stretch auf None zu stellen weiss ich nicht - waere auch mal aus zu probieren
(irgendwie sehen die images in deinem designer auch etwas hoeher aus, evtl werden die gestaucht? - da koennte das Stretch = None dann wirklich abhelfen)
Nein bringt alles nix, du kannst die buttons auch nebeneinander stellen. Die Buttons sind zur Laufzeit gleich hoch, gleich breit wie im Designer. Nur das Image ist unscharf.
das ist ja das komische
wenn man deine bilder so an schaut sind zwar die buttons gleich hoch - aber die images sehen unterschiedlich hoch aus - als wenn das image zur laufzeit kleiner gemacht werden muss
was passiert wenn du ein 40x40 grossen button machst, das image auf SnapToDevicePixel true , horizontal center , vertical center und strech = none ?
werds heute vieleich bei mir auch mal probieren wies ausschaut
// dazuedit
evtl spiels auch ne rolle wo der button ist - ob er in nem anderen panel sitzt oder direkt im window - kannst du auch mal testen