FF-273 - added auto crop image node

fixed issue with mp4 image based subtitles
This commit is contained in:
John Andrews
2022-08-09 11:24:07 +12:00
parent 1131d6be72
commit e6813b8e23
10 changed files with 215 additions and 39 deletions

View File

@@ -1,6 +1,19 @@
{
"Flow": {
"Parts": {
"AutoCropImage": {
"Outputs": {
"1": "Image cropped, saved to new temporary file",
"2": "Image was not cropped"
},
"Description": "Automatically crops an image",
"Fields": {
"Format": "Format",
"Format-Help": "The image format to convert to",
"Threshold": "Threshold",
"Threshold-Help": "Threshold for entropic density, default is 50. Must be between 0 and 100."
}
},
"ImageFlip": {
"Outputs": {
"1": "Image flipped, saved to new temporary file"

View File

@@ -0,0 +1,42 @@
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.Processing;
using System.ComponentModel;
namespace FileFlows.ImageNodes.Images;
public class AutoCropImage : ImageNode
{
public override int Inputs => 1;
public override int Outputs => 2;
public override FlowElementType Type => FlowElementType.Process;
public override string HelpUrl => "https://docs.fileflows.com/plugins/image-nodes/auto-crop-image";
public override string Icon => "fas fa-crop";
[Slider(1)]
[Range(1, 100)]
[DefaultValue(50)]
public int Threshold { get; set; }
public override int Execute(NodeParameters args)
{
using var image = Image.Load(args.WorkingFile, out IImageFormat format);
int originalWidth = image.Width;
int originalHeight= image.Height;
float threshold = Threshold / 100f;
if (threshold < 0)
threshold = 0.5f;
args.Logger?.ILog("Attempting to auto crop using threshold: " + threshold);
image.Mutate(c => c.EntropyCrop(threshold));
if (image.Width == originalWidth && image.Height == originalHeight)
return 2;
var formatOpts = GetFormat(args);
SaveImage(args, image, formatOpts.file, formatOpts.format ?? format);
args.Logger?.ILog($"Image cropped from '{originalWidth}x{originalHeight}' to '{image.Width}x{image.Height}'");
return 1;
}
}

View File

@@ -12,6 +12,7 @@ public class ImageNodesTests
string TestImage1;
string TestImage2;
string TempDir;
string TestCropImage1, TestCropImage2, TestCropImage3, TestCropImageNoCrop;
public ImageNodesTests()
{
@@ -21,6 +22,10 @@ public class ImageNodesTests
TestImage1 = @"D:\videos\pictures\image1.jpg";
TestImage2 = @"D:\videos\pictures\image2.png";
TempDir = @"D:\videos\temp";
TestCropImage1 = @"D:\images\testimages\crop01.jpg";
TestCropImage2 = @"D:\images\testimages\crop02.jpg";
TestCropImage3 = @"D:\images\testimages\crop03.jpg";
TestCropImageNoCrop = @"D:\images\testimages\nocrop.jpg";
}
else
{
@@ -109,6 +114,72 @@ public class ImageNodesTests
node.Angle = 270;
Assert.AreEqual(1, node.Execute(args));
}
[TestMethod]
public void ImageNodes_Basic_AutoCrop_01()
{
var logger = new TestLogger();
var args = new NodeParameters(TestCropImage1, logger, false, string.Empty)
{
TempPath = TempDir
};
var node = new AutoCropImage();
int result = node.Execute(args);
string log = logger.ToString();
Assert.AreEqual(1, result);
}
[TestMethod]
public void ImageNodes_Basic_AutoCrop_02()
{
var logger = new TestLogger();
var args = new NodeParameters(TestCropImage2, logger, false, string.Empty)
{
TempPath = TempDir
};
var node = new AutoCropImage();
node.Threshold = 95;
int result = node.Execute(args);
string log = logger.ToString();
Assert.AreEqual(1, result);
}
[TestMethod]
public void ImageNodes_Basic_AutoCrop_03()
{
var logger = new TestLogger();
var args = new NodeParameters(TestCropImage3, logger, false, string.Empty)
{
TempPath = TempDir
};
var node = new AutoCropImage();
int result = node.Execute(args);
string log = logger.ToString();
Assert.AreEqual(1, result);
}
[TestMethod]
public void ImageNodes_Basic_AutoCrop_NoCrop()
{
var logger = new TestLogger();
var args = new NodeParameters(TestCropImageNoCrop, logger, false, string.Empty)
{
TempPath = TempDir
};
var node = new AutoCropImage();
int result = node.Execute(args);
string log = logger.ToString();
Assert.AreEqual(2, result);
}
}
#endif