Отображение большого изображения, дико разнообразное использование памяти на разных ПКC#

Место общения программистов C#
Ответить
Anonymous
 Отображение большого изображения, дико разнообразное использование памяти на разных ПК

Сообщение Anonymous »

Я отображаю большое изображение в приложении WPF. 108000x960 пикселей. Он хорошо работает на паре ноутбуков - использует около 1 ГБ оперативной памяти, менее 5% процессора, плавно прокручивается по всему изображению. Но на двух других машинах использование памяти быстро увеличивается до более чем на 10 ГБ, когда вы прокрутите, и приложение замедляется. Одна из машин, которые работают, имеет только один дернм, остальные имеют 2 модуля. Два, у которых есть проблемы,-это i5-1340p и основной Ultra 7 155h. Core Ultra имеет оперативную память LPDDR5X 6400 MT/S, остальные имеют DRR4 3200. Позже, однако, я попробовал свой последний ноутбук, и он не был в порядке - огромное использование памяти и медленное.





< /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>
Я надеялся, что можно плавно прокручивать все изображение. Я не вижу причин, по которой некоторые машины работают нормально, а другие нет. Я использую .net 9, но другие должны работать.

Подробнее здесь: https://stackoverflow.com/questions/797 ... ferent-pcs
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»