Ich zeige ein großes Bild in einer WPF -App. 108000x960 Pixel. Es funktioniert gut auf einigen Laptops - verwendet etwa 1 GB RAM, weniger als 5% CPU und scrollt reibungslos über das Bild. Bei zwei anderen Maschinen steigt die Speicherverwendung jedoch schnell auf über 10 GB auf, wenn Sie scrollen und die App verlangsamt. Eine der Maschinen, die arbeiten, hat nur einen einzigen Sodimm, der Rest hat 2 Module. Die beiden Probleme sind ein i5-1340p und ein Core Ultra 7 155h. Der Core Ultra hat LPDDR5X 6400 MT/S RAM, der Rest hat DRR4 3200. Später habe ich jedoch meinen neuesten Laptop ausprobiert und es war nicht in Ordnung - riesige Speicherverwendung und langsam.
< /code>
Mainwindow.xaml.cs
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace GenerateFilmstrip
{
public partial class MainWindow : Window
{
private readonly Pen penWhite = new(Brushes.White, 5.0);
public MainWindow()
{
InitializeComponent();
LoadFilmstrip();
}
private void LoadFilmstrip()
{
int imageHeight = 960;
FilmstripImage.Height = imageHeight;
BitmapSource filmstrip = GenerateFilmstrip(
frameCount: 100,
frameWidth: 1080,
frameHeight: imageHeight,
rectWidth: 300,
rectHeight: 600,
cornerRadius: 20);
FilmstripImage.Source = filmstrip;
}
private RenderTargetBitmap GenerateFilmstrip(int frameCount, int frameWidth, int frameHeight, int rectWidth, int rectHeight, double cornerRadius)
{
int filmstripWidth = frameCount * frameWidth;
int filmstripHeight = frameHeight;
DrawingVisual drawingVisual = new();
using (DrawingContext drawingContext = drawingVisual.RenderOpen())
{
drawingContext.DrawRectangle(Brushes.Black, null, new Rect(0, 0, filmstripWidth, filmstripHeight));
for (int frame = 0; frame < frameCount; frame++)
DrawFrame(drawingContext, frame, frameCount, frameWidth, frameHeight, rectWidth, rectHeight, cornerRadius);
}
return CreateBitmapFromVisual(drawingVisual, filmstripWidth, filmstripHeight);
}
private void DrawFrame(DrawingContext drawingContext, int frameIndex, int totalFrames,
int frameWidth, int frameHeight, int rectWidth, int rectHeight, double cornerRadius)
{
double frameX = frameIndex * frameWidth;
double rotationAngle = (double)frameIndex / totalFrames * 360.0;
Color rectangleColor = GetCyclingColor(frameIndex, totalFrames);
SolidColorBrush rectangleBrush = new(rectangleColor);
double rectX = frameX + (frameWidth - rectWidth) / 2.0;
double rectY = (frameHeight - rectHeight) / 2.0;
TransformGroup transformGroup = new();
double centerX = rectX + rectWidth / 2.0;
double centerY = rectY + rectHeight / 2.0;
transformGroup.Children.Add(new RotateTransform(rotationAngle, centerX, centerY));
drawingContext.PushTransform(transformGroup);
Rect rectangleBounds = new(rectX, rectY, rectWidth, rectHeight);
drawingContext.DrawRoundedRectangle(rectangleBrush, penWhite, rectangleBounds, cornerRadius, cornerRadius);
drawingContext.Pop();
}
private static Color GetCyclingColor(int frameIndex, int totalFrames)
{
double hue = (double)frameIndex / totalFrames * 360.0;
return HsvToRgb(hue, 1.0, 1.0);
}
private static Color HsvToRgb(double hue, double saturation, double value)
{
int hi = Convert.ToInt32(Math.Floor(hue / 60)) % 6;
double f = hue / 60 - Math.Floor(hue / 60);
value *= 255;
byte v = Convert.ToByte(value);
byte p = Convert.ToByte(value * (1 - saturation));
byte q = Convert.ToByte(value * (1 - f * saturation));
byte t = Convert.ToByte(value * (1 - (1 - f) * saturation));
return hi switch
{
0 => Color.FromRgb(v, t, p),
1 => Color.FromRgb(q, v, p),
2 => Color.FromRgb(p, v, t),
3 => Color.FromRgb(p, q, v),
4 => Color.FromRgb(t, p, v),
_ => Color.FromRgb(v, p, q),
};
}
private RenderTargetBitmap CreateBitmapFromVisual(DrawingVisual visual, int width, int height)
{
RenderTargetBitmap renderTargetBitmap = new(width, height, 96, 96, PixelFormats.Pbgra32);
renderTargetBitmap.Render(visual);
renderTargetBitmap.Freeze();
return renderTargetBitmap;
}
}
}
< /code>
Ich hatte gehofft, dass man reibungslos durch das gesamte Bild scrollen kann. Ich kann keinen Grund sehen, warum einige Maschinen gut funktionieren und andere nicht. Ich benutze .net 9, aber andere sollten arbeiten.
Anzeigen eines großen Bildes, die auf verschiedenen PCs unterschiedlich unterschiedlich ist ⇐ C#
-
- Similar Topics
- Replies
- Views
- Last post
-
-
Ni Visa in C#; Probleme beim Lesen von Antworten eines anderen PCs über TCPIP
by Anonymous » » in C# - 0 Replies
- 9 Views
-
Last post by Anonymous
-