none
BitmapFrame zoomen und zuschneiden RRS feed

  • Frage

  • Ich brauche eine Methode wie ich ein BitmapFrame heranzoomen und einen Bereich daraus ausschneiden kann. Ich habe bereits diverse Artikel dazu gelesen, aber habe nie das gewünschte Ergebnis erhalten. Hier ist mein Code:

    TransformGroup transformGroup = new TransformGroup();
    ScaleTransform scaleTransform = new ScaleTransform(1.5, 1.5, 100, 100);
    transformGroup.Children.Add(scaleTransform);
    
    TransformedBitmap tb = new TransformedBitmap();
    tb.BeginInit();
    tb.Source = sourceBitmapFrame;
    tb.Transform = transformGroup;
    tb.EndInit();
    
    BitmapFrame targetBitmapFrame = BitmapFrame.Create(tb);

    Wenn ich das targetBitmapFrame anschaue sieht das Bild aber immer noch genau so aus wie das sourceBitmapFrame. Dasselbe Ergebnis erhalte ich wenn ich das TransformedBitmap über XAML erstelle:

    <Image>
      <Image.Source>
        <TransformedBitmap Source="Test.jpg">
          <TransformedBitmap.Transform>
            <ScaleTransform CenterX="100" CenterY="100" ScaleX="1.5" ScaleY="1.5" />
          </TransformedBitmap.Transform>
        </TransformedBitmap>
      </Image.Source>
    </Image>

    Nur wenn ich direkt über die RenderTransform Eigentschaft den ScaleTransform mache erhalte ich das gewünschte Ergebnis:

    <Image Name="image" Grid.Row="2" Source="Test.jpg">
      <Image.RenderTransform>
        <ScaleTransform CenterX="100" CenterY="100" ScaleX="1.5" ScaleY="1.5" />
      </Image.RenderTransform>
    </Image>

    Wo genau liegt hier der Fehler?

    Donnerstag, 14. November 2013 16:57

Antworten

  • Zuschneiden geht beispielsweise über die CroppedImage-Klasse. Die einzelnen Klassen kann man im XAML auch schachteln:

            <Image Stretch="None">
                <Image.Source>
                    <CroppedBitmap SourceRect="50,50,100,100">
                        <CroppedBitmap.Source>
                            <TransformedBitmap Source="D:\test\img.png">
                                <TransformedBitmap.Transform>
                                    <ScaleTransform CenterX="100" CenterY="100" ScaleX="1.5" ScaleY="1.5" />
                                </TransformedBitmap.Transform>
                            </TransformedBitmap>
                        </CroppedBitmap.Source>
                    </CroppedBitmap>
                </Image.Source>
            </Image>

    Die SourceRect-Eigenschaft übernimmt die Größe des ausschneide-Bereichs in folgender Reihenfolge:
    X-Koordinaten vom linken Rand, Y-Koordinate vom oberen Rand, Breite, Höhe

    Hier auch noch die C#-Version:

                img.Source = new CroppedBitmap(
                    new TransformedBitmap(//Transformierung 1
                        new BitmapImage(new Uri(@"D:\test\img.png")),//Bild laden
                        new ScaleTransform(1.5, 1.5, 100, 100)),//Transformation angeben
                    new Int32Rect(50, 50, 100, 100));//Ausschnitt
    PS: Transformationen (Scale, Rotate) kann man auch in einer TransformGroup auf einmal anwenden.



    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Donnerstag, 14. November 2013 17:55
    Moderator

Alle Antworten

  • Hallo,
    dein 2. XAML-Code funktioniert bei mir Tadellos.

    Hier ein Beweisscreenshot. Das untere ist mit der Transformation:

    Ich denke mal, das du den Unterschied nicht merkst, weil standardmäßig das Bild gestreckt wird. Wenn du zum Image-Control noch das Attribut Stretch auf None stellst, wird dir das Bild in Originalgröße angezeigt.

    In C# funktioniert es auch:

                img.Source = new TransformedBitmap(
                    new BitmapImage(new Uri(@"D:\test\img.png")),//Bild laden
                    new ScaleTransform(1.5, 1.5, 100, 100));//Transformation angeben


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Donnerstag, 14. November 2013 17:18
    Moderator
  • Hallo, danke für die schnelle Antwort. Mit Stretch="None" sehe ich tatsächlich einen Unterschied. Das Bild wird so aber auch einfach nur grösser. Ich möchte das Bild aber auch zuschneiden können, also einen Bereich daraus ausschneiden können und als neues BitmapFrame laden. Ist das auch möglich auf diese Weise?
    Donnerstag, 14. November 2013 17:38
  • Zuschneiden geht beispielsweise über die CroppedImage-Klasse. Die einzelnen Klassen kann man im XAML auch schachteln:

            <Image Stretch="None">
                <Image.Source>
                    <CroppedBitmap SourceRect="50,50,100,100">
                        <CroppedBitmap.Source>
                            <TransformedBitmap Source="D:\test\img.png">
                                <TransformedBitmap.Transform>
                                    <ScaleTransform CenterX="100" CenterY="100" ScaleX="1.5" ScaleY="1.5" />
                                </TransformedBitmap.Transform>
                            </TransformedBitmap>
                        </CroppedBitmap.Source>
                    </CroppedBitmap>
                </Image.Source>
            </Image>

    Die SourceRect-Eigenschaft übernimmt die Größe des ausschneide-Bereichs in folgender Reihenfolge:
    X-Koordinaten vom linken Rand, Y-Koordinate vom oberen Rand, Breite, Höhe

    Hier auch noch die C#-Version:

                img.Source = new CroppedBitmap(
                    new TransformedBitmap(//Transformierung 1
                        new BitmapImage(new Uri(@"D:\test\img.png")),//Bild laden
                        new ScaleTransform(1.5, 1.5, 100, 100)),//Transformation angeben
                    new Int32Rect(50, 50, 100, 100));//Ausschnitt
    PS: Transformationen (Scale, Rotate) kann man auch in einer TransformGroup auf einmal anwenden.



    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Donnerstag, 14. November 2013 17:55
    Moderator
  • Danke für die Hilfe, das hat super funktioniert. Ich war eben der Meinung das man das alles auch über die TransformGroup machen kann, aber in diesem Fall kommt man wohl nicht um die CroppedBitmap Klasse herum.
    Donnerstag, 14. November 2013 18:42