// Get scaling factor limited to available memory private static float GetUpperScalingLimit(SizeF scaledSize, float scalingFactor) { // estimate required memory and use 60% as threshold value var required = EffectGraph.GetEstimatedRequiredMemory(scaledSize); var threshold = (EffectGraph.AvailableMemory * 100) / 60; if (required > threshold) { // limit scaling factor to fit available memory var maxPixels = EffectGraph.GetMaximumPixelCount(threshold); var originalPixels = ((double)scaledSize.Width * scaledSize.Height) / scalingFactor; return((float)(maxPixels / originalPixels)); } return(scalingFactor); }
// Once the scaled style image exceed a certain size, warn the user. // The models are not GPU-accellerated and might be very slow to // calculate if the image size is rather large plus a large amount // of RAM is required private void WarnAboutImageSize() { var s = trackBarSize.Value / 100.0; var pixels = (long?)(pictureBoxStyle.Image?.Width * pictureBoxStyle.Image?.Height * s * s); var maximum = EffectGraph.GetMaximumPixelCount((long)(EffectGraph.AvailableMemory * 0.8)); if (pixels > maximum) { labelStyleDimensions.ForeColor = labelSizeWarning.ForeColor; labelStyleDimensions.Font = labelSizeWarning.Font; labelSizeWarning.Visible = true; panelWarning.Visible = true; } else { labelStyleDimensions.ForeColor = labelStyle.ForeColor; labelStyleDimensions.Font = labelStyle.Font; labelSizeWarning.Visible = false; panelWarning.Visible = false; } }