I've got a lot of images I need to load in from a directory into a project where I display a full-screened radrotator on a secondary monitor. I want to be able to show a slideshow of pictures, but I need them to properly fit the screen, and I'd like ones that are strange sizes to be horizontally and vertically centered. All of this seems to be working with my code so far except the centering part...
Here is my code:
Imports System.Windows.FormsImports Telerik.WinControls.UIImports System.IOImports System.Security.CryptographyPublic Class formSlideshow Private Sub ShapedForm1_Load(sender As Object, e As EventArgs) Handles Me.Load Me.FormBorderStyle = FormBorderStyle.None Me.Bounds = GetSecondaryScreen().Bounds Dim screensize As New Drawing.Size(Me.Width, Me.Height) RadRotator1.Size = screensize RadRotator1.Interval = (CInt(Val(formSettings.Interval)) * 1000) If LoadImages() = True Then RadRotator1.Start() End Sub '--Get size and location of secondary monitor Public Function GetSecondaryScreen() As System.Windows.Forms.Screen For Each windowscreen As System.Windows.Forms.Screen In System.Windows.Forms.Screen.AllScreens If Not windowscreen Is System.Windows.Forms.Screen.PrimaryScreen Then Return windowscreen End If Next Return Screen.PrimaryScreen End Function '--Load images into radRotator Public Function LoadImages() As Boolean Try Dim imageslist As New List(Of String) '--Get employees personal images For Each employeeimage As String In Directory.GetFiles(formSettings.EmployeeDir) If Path.GetExtension(employeeimage) = ".jpeg" Or Path.GetExtension(employeeimage) = ".png" Or Path.GetExtension(employeeimage) = ".jpg" Then imageslist.Add(employeeimage) End If Next '--Get default images For Each defaultimage As String In Directory.GetFiles(formSettings.DefaultDir) If Path.GetExtension(defaultimage) = ".jpeg" Or Path.GetExtension(defaultimage) = ".png" Or Path.GetExtension(defaultimage) = ".jpg" Then imageslist.Add(defaultimage) End If Next '--Randomize order of images imageslist.Sort(New Randomizer(Of String)()) '--Add images to radRotator item list For Each imagefile As String In imageslist Dim newimage As Image = Image.FromFile(imagefile) Dim rotatoritem As New RadImageItem() rotatoritem.Image = ScaleImage(newimage, 768, 1366) RadRotator1.Items.Add(rotatoritem) Next Return True Catch ex As Exception Return False End Try Return False End Function '--Shrink images to fit screen, proportionately Public Function ScaleImage(ByVal OldImage As Image, ByVal TargetHeight As Integer, ByVal TargetWidth As Integer) As System.Drawing.Image Try Dim NewHeight As Integer = TargetHeight Dim NewWidth As Integer = NewHeight / OldImage.Height * OldImage.Width If NewWidth > TargetWidth Then NewWidth = TargetWidth NewHeight = NewWidth / OldImage.Width * OldImage.Height End If Return New Bitmap(OldImage, NewWidth, NewHeight) Catch ex As Exception Return Nothing End Try Return Nothing End FunctionEnd ClassPublic Class Randomizer(Of T) Implements IComparer(Of T) '--Insures different instances are sorted in different orders Private Shared Salter As New Random() '--Only as random as your seed Private Salt As Integer Public Sub New() Salt = Salter.Next(Integer.MinValue, Integer.MaxValue) End Sub Private Shared sha As New SHA1CryptoServiceProvider() Private Function HashNSalt(ByVal x As Integer) As Integer Dim b() As Byte = sha.ComputeHash(BitConverter.GetBytes(x)) Dim r As Integer = 0 For i As Integer = 0 To b.Length - 1 Step 4 r = r Xor BitConverter.ToInt32(b, i) Next Return r Xor Salt End Function Public Function Compare(x As T, y As T) As Integer _ Implements IComparer(Of T).Compare Return HashNSalt(x.GetHashCode()).CompareTo(HashNSalt(y.GetHashCode())) End FunctionEnd Class