posizione Testo

This commit is contained in:
Maddo 2017-09-25 16:12:21 +02:00
commit 922315061d
5 changed files with 285 additions and 27 deletions

View file

@ -9,7 +9,9 @@ using MaddoLibrary.Base.Log;
using SixLabors.Fonts; using SixLabors.Fonts;
using SixLabors.ImageSharp; using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Drawing; using SixLabors.ImageSharp.Drawing;
using SixLabors.ImageSharp.MetaData.Profiles.Exif;
using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing;
using SixLabors.Primitives;
using Font = SixLabors.Fonts.Font; using Font = SixLabors.Fonts.Font;
using FontFamily = SixLabors.Fonts.FontFamily; using FontFamily = SixLabors.Fonts.FontFamily;
using FontStyle = SixLabors.Fonts.FontStyle; using FontStyle = SixLabors.Fonts.FontStyle;
@ -36,10 +38,25 @@ namespace CatalogLib
{ {
MaddoLogger.Log("Loaded Image: {0}", workFile.FullName); MaddoLogger.Log("Loaded Image: {0}", workFile.FullName);
//image.Rotate(-90); //image.Rotate(-90);
bool isRotated;
//if (PicSettings.Instance.r) var orientation = image.MetaData.ExifProfile.GetValue(ExifTag.Orientation);
image.Mutate(x => x.Resize(PicSettings.Instance.FotoAltezza, PicSettings.Instance.FotoLarghezza, new BoxResampler())); if ((ushort)orientation.Value != 1)
{
isRotated = true;
}
else
{
isRotated = false;
}
if (PicSettings.Instance.FotoRidimensiona)
{
// todo calcolare ridimensionamento
image.Mutate(x => x.Resize(PicSettings.Instance.FotoAltezza, PicSettings.Instance.FotoLarghezza, new BicubicResampler()));
}
if (PicSettings.Instance.GeneraleRotazioneAutomatica) if (PicSettings.Instance.GeneraleRotazioneAutomatica)
{ {
image.Mutate(img => img.AutoOrient()); image.Mutate(img => img.AutoOrient());
@ -107,7 +124,10 @@ namespace CatalogLib
if (PicSettings.Instance.EnableText) if (PicSettings.Instance.EnableText)
{ {
SetExtraText(image);
SetExtraText(image, isRotated);
MaddoLogger.Log("Drawn text on Image: {0}", workFile.FullName); MaddoLogger.Log("Drawn text on Image: {0}", workFile.FullName);
} }
@ -130,7 +150,7 @@ namespace CatalogLib
MaddoLogger.Log("Time Taken for {0}: {1}", workFile.FullName, s.Elapsed); MaddoLogger.Log("Time Taken for {0}: {1}", workFile.FullName, s.Elapsed);
} }
private void SetExtraText(Image<Rgba32> image) private void SetExtraText(Image<Rgba32> image, bool isRotated)
{ {
if (string.IsNullOrWhiteSpace(PicSettings.Instance.TestoApplicareOrizzontale)) if (string.IsNullOrWhiteSpace(PicSettings.Instance.TestoApplicareOrizzontale))
{ {
@ -138,6 +158,24 @@ namespace CatalogLib
return; return;
} }
string text;
if (isRotated)
{
if (PicSettings.Instance.TestoApplicareOrizzontale.Contains("$_"))
{
text = PicSettings.Instance.TestoApplicareOrizzontale.Replace("$_", "\r\n");
}
else
{
text = PicSettings.Instance.TestoApplicareOrizzontale.Replace("$_", "");
}
}
else
{
text = PicSettings.Instance.TestoApplicareOrizzontale.Replace("$_", "");
}
var fo = SixLabors.Fonts.SystemFonts.Find(PicSettings.Instance.NomeFont); var fo = SixLabors.Fonts.SystemFonts.Find(PicSettings.Instance.NomeFont);
@ -145,12 +183,27 @@ namespace CatalogLib
//var fff = FontCollection.SystemFonts.Find(PicSettings.Instance.NomeFont); //var fff = FontCollection.SystemFonts.Find(PicSettings.Instance.NomeFont);
//var fff = FontCollection.SystemFonts.Find("Segoe Print"); //var fff = FontCollection.SystemFonts.Find("Segoe Print");
var font = new Font(fo, (float)PicSettings.Instance.DimensioneFont, FontStyle.Regular); Font font;
if (!PicSettings.Instance.Grassetto)
{
font = new Font(fo, (float)PicSettings.Instance.DimensioneFont, FontStyle.Regular);
}
else
{
font = new Font(fo, (float)PicSettings.Instance.DimensioneFont, FontStyle.Bold);
}
// todo corsivo
//var font = new Font(fff, 8f, FontStyle.Regular); //var font = new Font(fff, 8f, FontStyle.Regular);
//Color c = Color.FromHex(FlipRgbString(PicSettings.Instance.ColoreTestoRGB)); //Color c = Color.FromHex(FlipRgbString(PicSettings.Instance.ColoreTestoRGB));
Rgba32 g = Rgba32.FromHex(FlipRgbString(PicSettings.Instance.ColoreTestoRGB)); Rgba32 g = Rgba32.FromHex(FlipRgbString(PicSettings.Instance.ColoreTestoRGB));
Rgba32 gBack = Rgba32.Black; // todo alpha
//TextMeasurer measurer = new TextMeasurer(); //TextMeasurer measurer = new TextMeasurer();
//var size = measurer.MeasureText(PicSettings.Instance.TestoApplicareOrizzontale, font, 72); //var size = measurer.MeasureText(PicSettings.Instance.TestoApplicareOrizzontale, font, 72);
@ -161,7 +214,108 @@ namespace CatalogLib
Vector2 center = new Vector2(image.Width / 2, image.Height / 2); //center horizontally, 10px down Vector2 center = new Vector2(image.Width / 2, image.Height / 2); //center horizontally, 10px down
var size = TextMeasurer.Measure(PicSettings.Instance.TestoApplicareOrizzontale, new RendererOptions(font)); var size = TextMeasurer.Measure(text, new RendererOptions(font));
var larghezzaStandard = size.Width;
var dimensioneStandard = (int) Math.Round(PicSettings.Instance.DimensioneFont);
if (size.Width > image.Width)
{
var c = dimensioneStandard;
do
{
if (c > 20)
{
c -= 5;
}
else
{
c -= 1;
}
if (PicSettings.Instance.Grassetto)
{
font = new Font(fo, c, FontStyle.Bold);
}
else
{
font = new Font(fo, c, FontStyle.Regular);
}
size = TextMeasurer.Measure(text,
new RendererOptions(font));
if (size.Width < image.Width)
{
larghezzaStandard = (int) Math.Round(size.Width);
break;
}
if (c <= 5)
{
break;
}
} while (dimensioneStandard == c);
}
float yPosFromBottom = 0;
switch (PicSettings.Instance.TextPosition)
{
case PicSettings.Positions.Alto:
yPosFromBottom = PicSettings.Instance.Margine;
break;
case PicSettings.Positions.Basso:
yPosFromBottom = image.Height - size.Height - (image.Height * PicSettings.Instance.Margine / 100);
break;
}
float xCenterofImg = 0;
// stringformat
switch (PicSettings.Instance.TextAlignment)
{
case PicSettings.Alignments.Sinistra:
xCenterofImg = PicSettings.Instance.Margine + (larghezzaStandard / 2);
if ((larghezzaStandard / 2) > (image.Width / 2) - PicSettings.Instance.Margine)
{
xCenterofImg = image.Width / 2;
}
break;
case PicSettings.Alignments.Centro:
xCenterofImg = image.Width / 2;
break;
case PicSettings.Alignments.Destra:
xCenterofImg = image.Width - PicSettings.Instance.Margine - larghezzaStandard / 2;
if (larghezzaStandard / 2 > image.Width / 2 - PicSettings.Instance.Margine)
{
xCenterofImg = image.Width / 2;
}
break;
}
// stringformat alignment center
if (PicSettings.Instance.Grassetto)
{
font = new Font(fo, dimensioneStandard, FontStyle.Bold);
}
else
{
font = new Font(fo, dimensioneStandard, FontStyle.Regular);
}
image.Mutate(x => x.DrawText(text, font, gBack, new PointF(xCenterofImg + 1 , yPosFromBottom + 1), new TextGraphicsOptions()
{
HorizontalAlignment = HorizontalAlignment.Center
}));
image.Mutate(x => x.DrawText(text, font, g, new PointF(xCenterofImg, yPosFromBottom), new TextGraphicsOptions()
{
HorizontalAlignment = HorizontalAlignment.Center
}));
return;
float scalingFactor = Math.Min(image.Width / size.Width, image.Height / size.Height); float scalingFactor = Math.Min(image.Width / size.Width, image.Height / size.Height);
Font scaledFont = new Font(font, scalingFactor * font.Size); Font scaledFont = new Font(font, scalingFactor * font.Size);

View file

@ -6,7 +6,7 @@ using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using MaddoLibrary.Base.Log;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace CatalogLib namespace CatalogLib
@ -71,6 +71,11 @@ namespace CatalogLib
SetBase(key, value); SetBase(key, value);
} }
public void SetFloat(string key, float value)
{
SetBase(key, value);
}
public void Set<T>(string key, T value) public void Set<T>(string key, T value)
{ {
SetBase(key, value); SetBase(key, value);
@ -134,6 +139,23 @@ namespace CatalogLib
return (double)_settingsDict[key]; return (double)_settingsDict[key];
} }
public float GetFloat(string key, float defaultValue = 0)
{
if (!_settingsDict.ContainsKey(key))
{
SetFloat(key, defaultValue);
}
if (_settingsDict[key] is float f) return f;
MaddoLogger.LogError("Error while parsing {0}", key);
float fl = 0;
SetFloat(key, float.TryParse(_settingsDict[key].ToString(), out f) ? fl : defaultValue);
return (float) _settingsDict[key];
}
public T Get<T>(string key, T defaultValue) public T Get<T>(string key, T defaultValue)
{ {
if (!_settingsDict.ContainsKey(key)) if (!_settingsDict.ContainsKey(key))
@ -146,6 +168,8 @@ namespace CatalogLib
} }
public string GetString(string key, string defaultValue = "") public string GetString(string key, string defaultValue = "")
{ {
if (!_settingsDict.ContainsKey(key)) if (!_settingsDict.ContainsKey(key))
@ -184,7 +208,10 @@ namespace CatalogLib
//return _settingsDict.ContainsKey(key) ? _settingsDict[key] : defaultValue; //return _settingsDict.ContainsKey(key) ? _settingsDict[key] : defaultValue;
} }
public T GetEnum<T>(string name, T defaultValue)
{
return (T)Enum.Parse(typeof(T), GetString(name, defaultValue.ToString()));
}
public void SetDefaults() public void SetDefaults()
{ {
@ -262,12 +289,8 @@ namespace CatalogLib
get { return 0; } get { return 0; }
} }
public string Posizione
{
get { return string.Empty; }
}
public DateTime DataPartenza { get; set; } public DateTime DataPartenza { get; set; }
public string TestoOrario { get; internal set; } public string TestoOrario { get; internal set; }
public int DimStandard { get; internal set; } public int DimStandard { get; internal set; }
@ -290,7 +313,9 @@ namespace CatalogLib
set { SetString("DirDestinazione", value); } set { SetString("DirDestinazione", value); }
} }
public float Margine { get; set; } public float Margine { get => GetFloat("Margin", 1);
set => SetFloat("Margin", value);
}
public float MargVert { get; set; } public float MargVert { get; set; }
public string Allineamento { get; set; } public string Allineamento { get; set; }
@ -432,8 +457,54 @@ namespace CatalogLib
} }
} }
public bool FotoRidimensiona
{
get => GetBool("FotoRidimensiona", false);
set => Set("FotoRidimensiona", value);
}
public Positions TextPosition
{
get => GetEnum("TextPosition", Positions.Alto); //(Positions)Enum.Parse(typeof(Positions), GetString("TextPosition", Positions.Alto.ToString()));
set => SetString("TextPosition", value.ToString());
}
public Alignments TextAlignment
{
get => GetEnum("TextAlignment", Alignments.Centro);
set => SetString("TextAlignment", value.ToString());
}
public bool Threading
{
get => GetBool("Threading", true);
set => SetBool("Threading", value);
}
[Obsolete]
public string Posizione
{
get => string.Empty;
set { }
}
#endregion #endregion
#region Enums
public enum Positions
{
Alto,
Basso
}
public enum Alignments
{
Sinistra,
Centro,
Destra
}
#endregion
} }
} }

View file

@ -65,6 +65,7 @@
<CheckBox Content="Forza JPG" x:Name="chkForzaJPG" IsChecked="{Binding GeneraleForzaJPG}" Margin="2"/> <CheckBox Content="Forza JPG" x:Name="chkForzaJPG" IsChecked="{Binding GeneraleForzaJPG}" Margin="2"/>
<CheckBox Content="Rotazione Automatica" x:Name="chkRotazioneAutomatica" IsChecked="{Binding GeneraleRotazioneAutomatica}" Margin="2"/> <CheckBox Content="Rotazione Automatica" x:Name="chkRotazioneAutomatica" IsChecked="{Binding GeneraleRotazioneAutomatica}" Margin="2"/>
<CheckBox Content="Sovrascrivi File" x:Name="chkSovrascriviFile" IsChecked="{Binding GeneraleSovrascriviFile}" Margin="2"/> <CheckBox Content="Sovrascrivi File" x:Name="chkSovrascriviFile" IsChecked="{Binding GeneraleSovrascriviFile}" Margin="2"/>
<CheckBox Content="MultiThreading" IsChecked="{Binding Threading}" Margin="2"></CheckBox>
</StackPanel> </StackPanel>
</GroupBox> </GroupBox>
<GroupBox Header="Sottocartelle" Margin="2"> <GroupBox Header="Sottocartelle" Margin="2">
@ -80,6 +81,7 @@
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition></RowDefinition>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<CheckBox Grid.Row="0" Grid.Column="1" Content="Crea Sottocartelle" x:Name="chkCreaSottocartelle" Margin="4,0,0,0" IsChecked="{Binding SubdirCreaSottoCartelle}"/> <CheckBox Grid.Row="0" Grid.Column="1" Content="Crea Sottocartelle" x:Name="chkCreaSottocartelle" Margin="4,0,0,0" IsChecked="{Binding SubdirCreaSottoCartelle}"/>
@ -112,6 +114,7 @@
</GroupBox.Header> </GroupBox.Header>
<Grid > <Grid >
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition />
<RowDefinition/> <RowDefinition/>
<RowDefinition/> <RowDefinition/>
<RowDefinition/> <RowDefinition/>
@ -125,16 +128,19 @@
<ColumnDefinition Width="88*"/> <ColumnDefinition Width="88*"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Label Grid.Row="0" Grid.Column="0" Content="Altezza" Grid.ColumnSpan="2" Margin="0,0,0,2" /> <Label Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Content="Ridimensiona"></Label>
<TextBox Grid.Row="0" Grid.Column="2" Margin="4,4,4,6" Text="{Binding FotoAltezza}"/> <CheckBox Grid.Row="0" Grid.Column="2" IsChecked="{Binding FotoRidimensiona}"></CheckBox>
<Label Grid.Row="1" Grid.Column="0" Content="Altezza" Grid.ColumnSpan="2" Margin="0,0,0,2" />
<TextBox Grid.Row="1" Grid.Column="2" Margin="4,4,4,6" Text="{Binding FotoAltezza}"/>
<Label Grid.Column="0" Content="Larghezza" Grid.ColumnSpan="2" Margin="0,26,0,2" Grid.RowSpan="2" /> <Label Grid.Row="1" Grid.Column="0" Content="Larghezza" Grid.ColumnSpan="2" Margin="0,26,0,2" Grid.RowSpan="2" />
<TextBox Grid.Row="1" Grid.Column="2" Margin="4,2,4,6" Text="{Binding FotoLarghezza}"></TextBox> <TextBox Grid.Row="2" Grid.Column="2" Margin="4,2,4,6" Text="{Binding FotoLarghezza}"></TextBox>
<Label Grid.Row="1" Grid.Column="0" Content="Qualità" Grid.ColumnSpan="2" Margin="0,24,0,1" Grid.RowSpan="2" /> <Label Grid.Row="2" Grid.Column="0" Content="Qualità" Grid.ColumnSpan="2" Margin="0,24,0,1" Grid.RowSpan="2" />
<!--<TextBox Grid.Row="2" Grid.Column="2" Width="80" Margin="4,2,4,5" />--> <!--<TextBox Grid.Row="2" Grid.Column="2" Width="80" Margin="4,2,4,5" />-->
<Grid Grid.Row="2" Grid.Column="2" > <Grid Grid.Row="3" Grid.Column="2" >
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition /> <ColumnDefinition />
<ColumnDefinition Width="20"/> <ColumnDefinition Width="20"/>
@ -144,11 +150,11 @@
</Grid> </Grid>
<CheckBox Grid.Row="3" Grid.Column="2" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0,16,0,17.88" IsChecked="{Binding FotoMantieniDimensioni}"/> <CheckBox Grid.Row="4" Grid.Column="2" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0,16,0,17.88" IsChecked="{Binding FotoMantieniDimensioni}"/>
<TextBlock Grid.Row="3" Grid.Column="0" VerticalAlignment="Center" Grid.ColumnSpan="2" HorizontalAlignment="Left" Text="Mantieni Dimensioni Originali" TextWrapping="WrapWithOverflow" Margin="4,0,4,25.88" /> <TextBlock Grid.Row="4" Grid.Column="0" VerticalAlignment="Center" Grid.ColumnSpan="2" HorizontalAlignment="Left" Text="Mantieni Dimensioni Originali" TextWrapping="WrapWithOverflow" Margin="4,0,4,25.88" />
<Label Grid.Row="4" Grid.Column="0" Content="Suffisso" Grid.ColumnSpan="2" Margin="0,0.12,0,-0.12" /> <Label Grid.Row="5" Grid.Column="0" Content="Suffisso" Grid.ColumnSpan="2" Margin="0,0.12,0,-0.12" />
<TextBox Grid.Row="4" Grid.Column="2" Width="80" Margin="4,4.12,4,3.88" Text="{Binding FotoSuffisso}" /> <TextBox Grid.Row="5" Grid.Column="2" Margin="4,4.12,4,3.88" Text="{Binding FotoSuffisso}" />
</Grid> </Grid>

View file

@ -118,7 +118,7 @@
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Label Grid.Row="0" Grid.Column="0" Content="Orizzontale" /> <Label Grid.Row="0" Grid.Column="0" Content="Orizzontale" />
<Label Grid.Row="1" Grid.Column="0" Content="Verticale" /> <Label Grid.Row="1" Grid.Column="0" Content="Verticale" />
<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding TestoApplicareOrizzontale}"/> <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding TestoApplicareOrizzontale}" AcceptsReturn="True"/>
<TextBox Grid.Row="1" Grid.Column="1" Height="50" MaxLines="4" AcceptsReturn="True" Text="{Binding TestoApplicareVerticale}"/> <TextBox Grid.Row="1" Grid.Column="1" Height="50" MaxLines="4" AcceptsReturn="True" Text="{Binding TestoApplicareVerticale}"/>
</Grid> </Grid>
<Grid> <Grid>
@ -150,7 +150,7 @@
<TextBox Grid.Row="4" Grid.Column="1" Text="{Binding TestoApplicareTempoGara}"/> <TextBox Grid.Row="4" Grid.Column="1" Text="{Binding TestoApplicareTempoGara}"/>
<Label Grid.Row="5" Grid.Column="0" Content="Margine (pixel)" /> <Label Grid.Row="5" Grid.Column="0" Content="Margine (pixel)" />
<TextBox Grid.Row="5" Grid.Column="1" Text="{Binding TestoApplicareMargine}"/> <TextBox Grid.Row="5" Grid.Column="1" Text="{Binding Margine}"/>
<Label Grid.Row="6" Grid.Column="0" Content="Allineamento" /> <Label Grid.Row="6" Grid.Column="0" Content="Allineamento" />
<TextBox Grid.Row="6" Grid.Column="1" Text="{Binding TestoApplicareAllineamento}"/> <TextBox Grid.Row="6" Grid.Column="1" Text="{Binding TestoApplicareAllineamento}"/>

View file

@ -130,6 +130,8 @@ namespace WPFCatalog
Task outerTask = OuterTask(); Task outerTask = OuterTask();
await outerTask; await outerTask;
} }
private async Task OuterTask() private async Task OuterTask()
@ -140,7 +142,7 @@ namespace WPFCatalog
// todo folder mode // todo folder mode
MaddoLogger.Log("Starting elaboration"); MaddoLogger.Log("Starting elaboration");
var files = Directory.EnumerateFiles(PicSettings.DirectorySorgente).ToArray(); var files = Directory.EnumerateFiles(PicSettings.DirectorySorgente).ToArray();
TotalPictures = files.Count(); TotalPictures = files.Count();
foreach (var file in files) foreach (var file in files)
{ {
@ -161,8 +163,13 @@ namespace WPFCatalog
} }
s.Start(); s.Start();
await Task.WhenAll(tasks); await Task.WhenAll(tasks);
//Task.WhenAll(tasks).Start(); //Task.WhenAll(tasks).Start();
s.Stop(); s.Stop();
//tt.RunSynchronously(); //tt.RunSynchronously();
@ -402,6 +409,16 @@ namespace WPFCatalog
} }
} }
public bool FotoRidimensiona
{
get { return PicSettings.FotoRidimensiona; }
set
{
PicSettings.FotoRidimensiona = value;
RaisePropertyChanged("FotoRidimensiona");
}
}
public int FotoAltezza public int FotoAltezza
{ {
get get
@ -782,7 +799,17 @@ namespace WPFCatalog
} }
} }
public bool Threading
{
get => PicSettings.Threading;
set { PicSettings.Threading = value; RaisePropertyChanged("Threading"); }
}
public float Margine
{
get => PicSettings.Margine;
set { PicSettings.Margine = value; RaisePropertyChanged("Margine"); }
}
#endregion #endregion