- Details
- Written by: Stanko Milosev
- Category: C#
- Hits: 3688
public void ResizeImage(string originalFilename, string saveTo, int canvasWidth, int canvasHeight) { try { Image image = Image.FromFile(originalFilename); Image thumbnail = new Bitmap(canvasWidth, canvasHeight); Graphics graphic = Graphics.FromImage(thumbnail); graphic.InterpolationMode = InterpolationMode.HighQualityBicubic; graphic.SmoothingMode = SmoothingMode.HighQuality; graphic.PixelOffsetMode = PixelOffsetMode.HighQuality; graphic.CompositingQuality = CompositingQuality.HighQuality; int originalWidth = image.Width; int originalHeight = image.Height; double ratioX = canvasWidth / (double)originalWidth; double ratioY = canvasHeight / (double)originalHeight; double ratio = ratioX < ratioY ? ratioX : ratioY; int newHeight = Convert.ToInt32(originalHeight * ratio); int newWidth = Convert.ToInt32(originalWidth * ratio); int posX = Convert.ToInt32((canvasWidth - (originalWidth * ratio)) / 2); int posY = Convert.ToInt32((canvasHeight - (originalHeight * ratio)) / 2); graphic.Clear(Color.White); // white padding graphic.DrawImage(image, posX, posY, newWidth, newHeight); ImageCodecInfo[] info = ImageCodecInfo.GetImageEncoders(); EncoderParameters encoderParameters; encoderParameters = new EncoderParameters(1); encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 100L); int OrientationKey = 0x0112; const int NotSpecified = 0; const int NormalOrientation = 1; const int MirrorHorizontal = 2; const int UpsideDown = 3; const int MirrorVertical = 4; const int MirrorHorizontalAndRotateRight = 5; const int RotateLeft = 6; const int MirorHorizontalAndRotateLeft = 7; const int RotateRight = 8; if (image.PropertyIdList.Contains(OrientationKey)) { if (image.PropertyIdList.Contains(OrientationKey)) { var orientation = (int)image.GetPropertyItem(OrientationKey).Value[0]; switch (orientation) { case NotSpecified: // Assume it is good. case NormalOrientation: // No rotation required. break; case MirrorHorizontal: thumbnail.RotateFlip(RotateFlipType.RotateNoneFlipX); break; case UpsideDown: thumbnail.RotateFlip(RotateFlipType.Rotate180FlipNone); break; case MirrorVertical: thumbnail.RotateFlip(RotateFlipType.Rotate180FlipX); break; case MirrorHorizontalAndRotateRight: thumbnail.RotateFlip(RotateFlipType.Rotate90FlipX); break; case RotateLeft: thumbnail.RotateFlip(RotateFlipType.Rotate90FlipNone); break; case MirorHorizontalAndRotateLeft: thumbnail.RotateFlip(RotateFlipType.Rotate270FlipX); break; case RotateRight: thumbnail.RotateFlip(RotateFlipType.Rotate270FlipNone); break; default: throw new NotImplementedException("An orientation of " + orientation + " isn't implemented."); } } } //thumbnail.RotateFlip(RotateFlipType.Rotate90FlipNone); thumbnail.Save(saveTo, info[1], encoderParameters); Debug.WriteLine($"Thumbnail from file: {originalFilename} created in {saveTo}"); } catch (Exception e) { Debug.WriteLine($"Error creating thumbnail: {e.Message}"); } }POI:
int OrientationKey = 0x0112; const int NotSpecified = 0; const int NormalOrientation = 1; const int MirrorHorizontal = 2; const int UpsideDown = 3; const int MirrorVertical = 4; const int MirrorHorizontalAndRotateRight = 5; const int RotateLeft = 6; const int MirorHorizontalAndRotateLeft = 7; const int RotateRight = 8; if (image.PropertyIdList.Contains(OrientationKey)) { if (image.PropertyIdList.Contains(OrientationKey)) { var orientation = (int)image.GetPropertyItem(OrientationKey).Value[0]; switch (orientation) { case NotSpecified: // Assume it is good. case NormalOrientation: // No rotation required. break; case MirrorHorizontal: thumbnail.RotateFlip(RotateFlipType.RotateNoneFlipX); break; case UpsideDown: thumbnail.RotateFlip(RotateFlipType.Rotate180FlipNone); break; case MirrorVertical: thumbnail.RotateFlip(RotateFlipType.Rotate180FlipX); break; case MirrorHorizontalAndRotateRight: thumbnail.RotateFlip(RotateFlipType.Rotate90FlipX); break; case RotateLeft: thumbnail.RotateFlip(RotateFlipType.Rotate90FlipNone); break; case MirorHorizontalAndRotateLeft: thumbnail.RotateFlip(RotateFlipType.Rotate270FlipX); break; case RotateRight: thumbnail.RotateFlip(RotateFlipType.Rotate270FlipNone); break; default: throw new NotImplementedException("An orientation of " + orientation + " isn't implemented."); } } }With this code I was checking if image has to be rotated. Example application (at this moment still under development), you can see on my GitHub. --- UPDATE 2024-04-06 Note that Image and are I disposable, so correct way would be:
public void ResizeImage(string originalFilename, string saveTo, int canvasWidth, int canvasHeight) { try { using (Image image = Image.FromFile(originalFilename)) using (Image thumbnail = new Bitmap(canvasWidth, canvasHeight)) using (Graphics graphic = Graphics.FromImage(thumbnail)) { ...Otherwise image file will stay locked.
- Details
- Written by: Stanko Milosev
- Category: C#
- Hits: 1518
using System; using System.Collections.Generic; using System.Windows.Forms; namespace UltraGridHierarchical { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { List<MyChild> stankosKids = new List<MyChild>(); stankosKids.Add(new MyChild {Name = "Velimir", Gender = "Male"}); stankosKids.Add(new MyChild {Name = "Hilda", Gender = "Female"}); List<MyChild> arnoldsKids = new List<MyChild>(); arnoldsKids.Add(new MyChild {Name = "Thomas", Gender = "Male"}); arnoldsKids.Add(new MyChild {Name = "Sabrina", Gender = "Female"}); List<MyChild> chucksKids = new List<MyChild>(); chucksKids.Add(new MyChild {Name = "Bruce", Gender = "Male"}); chucksKids.Add(new MyChild {Name = "Lee", Gender = "Female"}); List<MyParent> list = new List<MyParent>(); list.Add(new MyParent {ID = 1, FirstName = "Stanko", LastName = "Milosev", Address = "Herseler strasse 8", MyKids = stankosKids}); list.Add(new MyParent {ID = 2, FirstName = "Arnold", LastName = "Schwarzeneger", Address = "Whitehouse 1", MyKids = arnoldsKids}); list.Add(new MyParent {ID = 3, FirstName = "Chuck", LastName = "Norris", Address = "Las Vegas", MyKids = chucksKids}); ultraGrid1.SetDataBinding(list, null); } public class MyParent { public int ID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Address { get; set; } public List<MyChild> MyKids { get; set; } } public class MyChild { public string Name { get; set; } public string Gender { get; set; } } } }Source code.
- Details
- Written by: Stanko Milosev
- Category: C#
- Hits: 6276
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="links" type="System.Configuration.NameValueSectionHandler"> </section> </configSections> <links> <add key="link1" value="http://www.milosev.com/csharp/" /> <add key="link2" value="http://milosev.com/asp-net-mvc-3" /> </links> <appSettings> <add key="homePage" value="http://milosev.com/" /> </appSettings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> </startup> </configuration>.NET code:
using System; using System.Collections.Specialized; using System.Configuration; namespace CustomConfig { class Program { static void Main(string[] args) { NameValueCollection links = ConfigurationManager.GetSection("links") as NameValueCollection; string homePage = ConfigurationManager.AppSettings.Get("homePage"); Console.WriteLine("Home page: " + homePage); foreach (string link in links) { Console.WriteLine("Link: " + links.Get(link)); } Console.WriteLine("Press any key..."); Console.ReadKey(); } } }In reference list you will need to add System.Configuration. POI:
<configSections> <section name="links" type="System.Configuration.NameValueSectionHandler"> </section> </configSections>Here is more about configSection. Also notice line: Console.WriteLine("Link: " + links.Get(link));
- Details
- Written by: Stanko Milosev
- Category: C#
- Hits: 6418
One my example of interpolated string (taken from here):
string name = "stanko"; DateTime hours = DateTime.Now; Console.WriteLine($"Name = {name}, hours = {hours:hh}"); Console.ReadKey();
Composite string:
string name = "stanko"; Console.WriteLine("Name = {0}, hours = {1:hh}", name, DateTime.Now); Console.ReadKey();
According to Microsoft:
Interpolated string are easier to understand than a composite format string.Â