- Details
- Written by: Stanko Milosev
- Category: C#
- Hits: 3850
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: 1628
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: 6437
<?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: 6551
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.