mirror of
https://github.com/revenz/FileFlowsPlugins.git
synced 2026-01-06 10:20:13 -06:00
FF-273 - added auto crop image node
fixed issue with mp4 image based subtitles
This commit is contained in:
@@ -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"
|
||||
|
||||
42
ImageNodes/Images/AutoCropImage.cs
Normal file
42
ImageNodes/Images/AutoCropImage.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user