[C# / WPF] RenderTargetBitmap probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Hyperz
  • Registratie: Augustus 2009
  • Laatst online: 09-07 02:45
Hey :).

Ik hier een NFO viewer gemaakt in C#/WPF. Naast het bekijken van NFO's wil ik die ook kunnen exporteren naar een PNG afbeelding. Hiervoor heb ik het volgende gedaan:

code:
1
2
3
4
5
6
7
8
9
        <ScrollViewer x:Name="scrollNfo" Grid.Row="1" Background="{Binding ElementName=txtNfo, Path=Background}"
                      HorizontalScrollBarVisibility="Auto" HorizontalContentAlignment="Center">
            <TextBox x:Name="txtNfo" Background="#FF212121" Foreground="#FFDEDEDE" FontFamily="Courier New"
                     Padding="5" HorizontalAlignment="Center" BorderThickness="0" IsReadOnly="True">
                <TextBox.BorderBrush>
                    <SolidColorBrush />
                </TextBox.BorderBrush>
            </TextBox>
        </ScrollViewer>


C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
        private void menuExportAsImage_Click(object sender, RoutedEventArgs e)
        {
            var sfd = new System.Windows.Forms.SaveFileDialog();

            sfd.AddExtension = true;
            sfd.CheckFileExists = false;
            sfd.CheckPathExists = false;
            sfd.FileName = System.IO.Path.GetFileNameWithoutExtension(this.currentFile);
            sfd.Filter = Res.SaveImageFilter;
            sfd.RestoreDirectory = false;
            sfd.SupportMultiDottedExtensions = true;

            if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                RenderTargetBitmap renderTarget = new RenderTargetBitmap(
                    (int)Math.Ceiling(this.txtNfo.ActualWidth),
                    (int)Math.Ceiling(this.txtNfo.ActualHeight),
                    96d, 96d, PixelFormats.Default);

                renderTarget.Clear();
                renderTarget.Render(this.txtNfo);

                PngBitmapEncoder encoder = new PngBitmapEncoder();
                encoder.Frames.Add(BitmapFrame.Create(renderTarget));

                using (var fs = File.Create(sfd.FileName)) encoder.Save(fs);
            }
        }


Nu, wanneer ik een NFO bestand open en deze direct export naar een afbeelding werkt dit perfect. Maar als ik eerst naar beneden scroll om de NFO te lezen en daarna export dan is telkens een stuk van de afbeelding volledig transparant. Namelijk het stuk dat niet zichtbaar is in het programma. Iemand enig idee hoe ik dit kan oplossen?

Alvast bedank!

Asus P8P67 EVO | i5 2500k (4.8 GHz) | Sapphire HD 7970 Vapor-X GHz Ed. | 8 GB DDR3 1600 | 1 TB HDD


Acties:
  • 0 Henk 'm!

  • Phyxion
  • Registratie: April 2004
  • Niet online

Phyxion

_/-\o_

Als je niet scrollt saved ie dan wel de hele nfo of alleen het stuk wat zichtbaar is?

[ Voor 32% gewijzigd door Phyxion op 15-07-2010 08:51 ]

'You like a gay cowboy and you look like a gay terrorist.' - James May


Acties:
  • 0 Henk 'm!

  • Phyxion
  • Registratie: April 2004
  • Niet online

Phyxion

_/-\o_

Dubbel.

[ Voor 95% gewijzigd door Phyxion op 15-07-2010 08:51 ]

'You like a gay cowboy and you look like a gay terrorist.' - James May


Acties:
  • 0 Henk 'm!

  • Hyperz
  • Registratie: Augustus 2009
  • Laatst online: 09-07 02:45
Phyxion schreef op donderdag 15 juli 2010 @ 08:50:
Als je niet scrollt saved ie dan wel de hele nfo of alleen het stuk wat zichtbaar is?
Dan saved hij idd de hele NFO, dus inclusief het niet zichtbare gedeelte onder de "fold". Maar als ik scroll dan niet meer.

Asus P8P67 EVO | i5 2500k (4.8 GHz) | Sapphire HD 7970 Vapor-X GHz Ed. | 8 GB DDR3 1600 | 1 TB HDD


Acties:
  • 0 Henk 'm!

  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02 21:38

TheNameless

Jazzballet is vet!

Waarschijnlijk komt dit omdat je Textbox in een ScrollViewer zit en dat deze zijn contents "clipped".

Kan je niet gewoon je TextBox opnieuw opbouwen in code en die dan renderen naar een RenderTargetBitmap?

Zou volgens mij wel moeten werken :)

Ducati: making mechanics out of riders since 1946


Acties:
  • 0 Henk 'm!

  • Hyperz
  • Registratie: Augustus 2009
  • Laatst online: 09-07 02:45
Bedoel je iets als dit:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
        private void menuExportAsImage_Click(object sender, RoutedEventArgs e)
        {
            var sfd = new System.Windows.Forms.SaveFileDialog();

            sfd.AddExtension = true;
            sfd.CheckFileExists = false;
            sfd.CheckPathExists = false;
            sfd.FileName = System.IO.Path.GetFileNameWithoutExtension(this.currentFile);
            sfd.Filter = Res.SaveImageFilter;
            sfd.RestoreDirectory = false;
            sfd.SupportMultiDottedExtensions = true;

            if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                TextBlock textBlock = new TextBlock()
                {
                    Text = this.txtNfo.Text,
                    Padding = this.txtNfo.Padding,
                    Foreground = this.txtNfo.Foreground,
                    Background = this.txtNfo.Background,
                    Width = this.txtNfo.ActualWidth,
                    Height = this.txtNfo.ActualHeight,
                };

                gridRoot.Children.Add(textBlock);

                RenderTargetBitmap renderTarget = new RenderTargetBitmap(
                    (int)Math.Ceiling(textBlock.Width),
                    (int)Math.Ceiling(textBlock.Height),
                    96d, 96d, PixelFormats.Default);

                renderTarget.Clear();
                renderTarget.Render(textBlock);

                PngBitmapEncoder encoder = new PngBitmapEncoder();
                encoder.Frames.Add(BitmapFrame.Create(renderTarget));

                using (var fs = File.Create(sfd.FileName)) encoder.Save(fs);
                gridRoot.Children.Remove(textBlock);
            }
        }


Dit werkt ook niet. Ik krijg telkens een voledig transparante afbeelding. Ook wanneer ik gridRoot.Children.Add(textBlock) weglaat :?.

Asus P8P67 EVO | i5 2500k (4.8 GHz) | Sapphire HD 7970 Vapor-X GHz Ed. | 8 GB DDR3 1600 | 1 TB HDD


Acties:
  • 0 Henk 'm!

  • Nappa
  • Registratie: Februari 2001
  • Laatst online: 27-06 00:10

Nappa

The Barbaric Saiya-jin!

Had je deze al gevonden? Er wordt gesteld dat dit soort problemen voor kunnen komen omdat het renderen op een ander niveau gebeurt en biedt een oplossing aan door het te renderen gedeelte te wrappen in een object en vervolgens dat object te renderen.

Alles wat ik zeg kan en zal tegen u gebruikt worden
Scream! Suffer! Panic! | Dark-future Dawnbringer | Unofficial Mordor community


Acties:
  • 0 Henk 'm!

  • Hyperz
  • Registratie: Augustus 2009
  • Laatst online: 09-07 02:45
Hmm interessant artikel :). Ik mijn event handler even aangepast:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
        private void menuExportAsImage_Click(object sender, RoutedEventArgs e)
        {
            var sfd = new System.Windows.Forms.SaveFileDialog();

            sfd.AddExtension = true;
            sfd.CheckFileExists = false;
            sfd.CheckPathExists = false;
            sfd.FileName = System.IO.Path.GetFileNameWithoutExtension(this.currentFile);
            sfd.Filter = Res.SaveImageFilter;
            sfd.RestoreDirectory = false;
            sfd.SupportMultiDottedExtensions = true;

            if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                Size size = new Size(
                    Math.Ceiling(this.txtNfo.ActualWidth),
                    Math.Ceiling(this.txtNfo.ActualHeight));

                RenderTargetBitmap renderTarget = new RenderTargetBitmap(
                    (int)size.Width, (int)size.Height,
                    96d, 96d, PixelFormats.Default);

                DrawingVisual dv = new DrawingVisual();

                using (DrawingContext dc = dv.RenderOpen())
                {
                    VisualBrush vb = new VisualBrush(this.txtNfo);
                    dc.DrawRectangle(vb, null, new Rect(new Point(), size));
                }

                renderTarget.Render(dv);
                
                PngBitmapEncoder encoder = new PngBitmapEncoder();
                encoder.Frames.Add(BitmapFrame.Create(renderTarget));

                using (FileStream fs = File.Create(sfd.FileName))
                {
                    encoder.Save(fs);
                }
            }
        }


De XAML heb ik niet verandert maar nu lijkt het inderdaad perfect te werken. Bedankt voor de hulp! _/-\o_

Asus P8P67 EVO | i5 2500k (4.8 GHz) | Sapphire HD 7970 Vapor-X GHz Ed. | 8 GB DDR3 1600 | 1 TB HDD

Pagina: 1