mirror of https://github.com/SixLabors/ImageSharp
Browse Source
# Conflicts:
# src/ImageSharp/Formats/Gif/GifDecoderCore.cs
# src/ImageSharp/Formats/Png/PngEncoderCore.cs
# src/ImageSharp/Image/ImageFrame{TPixel}.cs
# src/ImageSharp/Memory/Buffer{T}.cs
# src/ImageSharp/Memory/PixelDataPool{T}.cs
# src/ImageSharp/Processing/Processors/Filters/LomographProcessor.cs
# src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor.cs
# src/ImageSharp/Processing/Processors/Transforms/ResamplingWeightedProcessor.Weights.cs
# src/ImageSharp/Processing/Processors/Transforms/ResizeProcessor.cs
# src/ImageSharp/Processing/Processors/Transforms/RotateProcessor.cs
# src/ImageSharp/Processing/Processors/Transforms/SkewProcessor.cs
# tests/ImageSharp.Tests/Memory/PixelDataPoolTests.cs
# tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeProfilingBenchmarks.cs
af/merge-core
212 changed files with 4803 additions and 2728 deletions
@ -1,13 +0,0 @@ |
|||
Copyright 2012 James South |
|||
|
|||
Licensed under the Apache License, Version 2.0 (the "License"); |
|||
you may not use this file except in compliance with the License. |
|||
You may obtain a copy of the License at |
|||
|
|||
http://www.apache.org/licenses/LICENSE-2.0 |
|||
|
|||
Unless required by applicable law or agreed to in writing, software |
|||
distributed under the License is distributed on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
See the License for the specific language governing permissions and |
|||
limitations under the License. |
|||
@ -1,14 +0,0 @@ |
|||
<SolutionConfiguration> |
|||
<FileVersion>1</FileVersion> |
|||
<InferProjectReferencesUsingAssemblyNames>false</InferProjectReferencesUsingAssemblyNames> |
|||
<AllowParallelTestExecution>false</AllowParallelTestExecution> |
|||
<AllowTestsToRunInParallelWithThemselves>true</AllowTestsToRunInParallelWithThemselves> |
|||
<FrameworkUtilisationTypeForNUnit>UseDynamicAnalysis</FrameworkUtilisationTypeForNUnit> |
|||
<FrameworkUtilisationTypeForGallio>UseStaticAnalysis</FrameworkUtilisationTypeForGallio> |
|||
<FrameworkUtilisationTypeForMSpec>UseStaticAnalysis</FrameworkUtilisationTypeForMSpec> |
|||
<FrameworkUtilisationTypeForMSTest>UseStaticAnalysis</FrameworkUtilisationTypeForMSTest> |
|||
<FrameworkUtilisationTypeForXUnit2>UseDynamicAnalysis</FrameworkUtilisationTypeForXUnit2> |
|||
<NCrunchCacheStoragePath /> |
|||
<MetricsExclusionList> |
|||
</MetricsExclusionList> |
|||
</SolutionConfiguration> |
|||
@ -1,6 +0,0 @@ |
|||
<SolutionConfiguration> |
|||
<Settings> |
|||
<AllowParallelTestExecution>True</AllowParallelTestExecution> |
|||
<SolutionConfigured>True</SolutionConfigured> |
|||
</Settings> |
|||
</SolutionConfiguration> |
|||
@ -0,0 +1,201 @@ |
|||
Apache License |
|||
Version 2.0, January 2004 |
|||
http://www.apache.org/licenses/ |
|||
|
|||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION |
|||
|
|||
1. Definitions. |
|||
|
|||
"License" shall mean the terms and conditions for use, reproduction, |
|||
and distribution as defined by Sections 1 through 9 of this document. |
|||
|
|||
"Licensor" shall mean the copyright owner or entity authorized by |
|||
the copyright owner that is granting the License. |
|||
|
|||
"Legal Entity" shall mean the union of the acting entity and all |
|||
other entities that control, are controlled by, or are under common |
|||
control with that entity. For the purposes of this definition, |
|||
"control" means (i) the power, direct or indirect, to cause the |
|||
direction or management of such entity, whether by contract or |
|||
otherwise, or (ii) ownership of fifty percent (50%) or more of the |
|||
outstanding shares, or (iii) beneficial ownership of such entity. |
|||
|
|||
"You" (or "Your") shall mean an individual or Legal Entity |
|||
exercising permissions granted by this License. |
|||
|
|||
"Source" form shall mean the preferred form for making modifications, |
|||
including but not limited to software source code, documentation |
|||
source, and configuration files. |
|||
|
|||
"Object" form shall mean any form resulting from mechanical |
|||
transformation or translation of a Source form, including but |
|||
not limited to compiled object code, generated documentation, |
|||
and conversions to other media types. |
|||
|
|||
"Work" shall mean the work of authorship, whether in Source or |
|||
Object form, made available under the License, as indicated by a |
|||
copyright notice that is included in or attached to the work |
|||
(an example is provided in the Appendix below). |
|||
|
|||
"Derivative Works" shall mean any work, whether in Source or Object |
|||
form, that is based on (or derived from) the Work and for which the |
|||
editorial revisions, annotations, elaborations, or other modifications |
|||
represent, as a whole, an original work of authorship. For the purposes |
|||
of this License, Derivative Works shall not include works that remain |
|||
separable from, or merely link (or bind by name) to the interfaces of, |
|||
the Work and Derivative Works thereof. |
|||
|
|||
"Contribution" shall mean any work of authorship, including |
|||
the original version of the Work and any modifications or additions |
|||
to that Work or Derivative Works thereof, that is intentionally |
|||
submitted to Licensor for inclusion in the Work by the copyright owner |
|||
or by an individual or Legal Entity authorized to submit on behalf of |
|||
the copyright owner. For the purposes of this definition, "submitted" |
|||
means any form of electronic, verbal, or written communication sent |
|||
to the Licensor or its representatives, including but not limited to |
|||
communication on electronic mailing lists, source code control systems, |
|||
and issue tracking systems that are managed by, or on behalf of, the |
|||
Licensor for the purpose of discussing and improving the Work, but |
|||
excluding communication that is conspicuously marked or otherwise |
|||
designated in writing by the copyright owner as "Not a Contribution." |
|||
|
|||
"Contributor" shall mean Licensor and any individual or Legal Entity |
|||
on behalf of whom a Contribution has been received by Licensor and |
|||
subsequently incorporated within the Work. |
|||
|
|||
2. Grant of Copyright License. Subject to the terms and conditions of |
|||
this License, each Contributor hereby grants to You a perpetual, |
|||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable |
|||
copyright license to reproduce, prepare Derivative Works of, |
|||
publicly display, publicly perform, sublicense, and distribute the |
|||
Work and such Derivative Works in Source or Object form. |
|||
|
|||
3. Grant of Patent License. Subject to the terms and conditions of |
|||
this License, each Contributor hereby grants to You a perpetual, |
|||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable |
|||
(except as stated in this section) patent license to make, have made, |
|||
use, offer to sell, sell, import, and otherwise transfer the Work, |
|||
where such license applies only to those patent claims licensable |
|||
by such Contributor that are necessarily infringed by their |
|||
Contribution(s) alone or by combination of their Contribution(s) |
|||
with the Work to which such Contribution(s) was submitted. If You |
|||
institute patent litigation against any entity (including a |
|||
cross-claim or counterclaim in a lawsuit) alleging that the Work |
|||
or a Contribution incorporated within the Work constitutes direct |
|||
or contributory patent infringement, then any patent licenses |
|||
granted to You under this License for that Work shall terminate |
|||
as of the date such litigation is filed. |
|||
|
|||
4. Redistribution. You may reproduce and distribute copies of the |
|||
Work or Derivative Works thereof in any medium, with or without |
|||
modifications, and in Source or Object form, provided that You |
|||
meet the following conditions: |
|||
|
|||
(a) You must give any other recipients of the Work or |
|||
Derivative Works a copy of this License; and |
|||
|
|||
(b) You must cause any modified files to carry prominent notices |
|||
stating that You changed the files; and |
|||
|
|||
(c) You must retain, in the Source form of any Derivative Works |
|||
that You distribute, all copyright, patent, trademark, and |
|||
attribution notices from the Source form of the Work, |
|||
excluding those notices that do not pertain to any part of |
|||
the Derivative Works; and |
|||
|
|||
(d) If the Work includes a "NOTICE" text file as part of its |
|||
distribution, then any Derivative Works that You distribute must |
|||
include a readable copy of the attribution notices contained |
|||
within such NOTICE file, excluding those notices that do not |
|||
pertain to any part of the Derivative Works, in at least one |
|||
of the following places: within a NOTICE text file distributed |
|||
as part of the Derivative Works; within the Source form or |
|||
documentation, if provided along with the Derivative Works; or, |
|||
within a display generated by the Derivative Works, if and |
|||
wherever such third-party notices normally appear. The contents |
|||
of the NOTICE file are for informational purposes only and |
|||
do not modify the License. You may add Your own attribution |
|||
notices within Derivative Works that You distribute, alongside |
|||
or as an addendum to the NOTICE text from the Work, provided |
|||
that such additional attribution notices cannot be construed |
|||
as modifying the License. |
|||
|
|||
You may add Your own copyright statement to Your modifications and |
|||
may provide additional or different license terms and conditions |
|||
for use, reproduction, or distribution of Your modifications, or |
|||
for any such Derivative Works as a whole, provided Your use, |
|||
reproduction, and distribution of the Work otherwise complies with |
|||
the conditions stated in this License. |
|||
|
|||
5. Submission of Contributions. Unless You explicitly state otherwise, |
|||
any Contribution intentionally submitted for inclusion in the Work |
|||
by You to the Licensor shall be under the terms and conditions of |
|||
this License, without any additional terms or conditions. |
|||
Notwithstanding the above, nothing herein shall supersede or modify |
|||
the terms of any separate license agreement you may have executed |
|||
with Licensor regarding such Contributions. |
|||
|
|||
6. Trademarks. This License does not grant permission to use the trade |
|||
names, trademarks, service marks, or product names of the Licensor, |
|||
except as required for reasonable and customary use in describing the |
|||
origin of the Work and reproducing the content of the NOTICE file. |
|||
|
|||
7. Disclaimer of Warranty. Unless required by applicable law or |
|||
agreed to in writing, Licensor provides the Work (and each |
|||
Contributor provides its Contributions) on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
|||
implied, including, without limitation, any warranties or conditions |
|||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A |
|||
PARTICULAR PURPOSE. You are solely responsible for determining the |
|||
appropriateness of using or redistributing the Work and assume any |
|||
risks associated with Your exercise of permissions under this License. |
|||
|
|||
8. Limitation of Liability. In no event and under no legal theory, |
|||
whether in tort (including negligence), contract, or otherwise, |
|||
unless required by applicable law (such as deliberate and grossly |
|||
negligent acts) or agreed to in writing, shall any Contributor be |
|||
liable to You for damages, including any direct, indirect, special, |
|||
incidental, or consequential damages of any character arising as a |
|||
result of this License or out of the use or inability to use the |
|||
Work (including but not limited to damages for loss of goodwill, |
|||
work stoppage, computer failure or malfunction, or any and all |
|||
other commercial damages or losses), even if such Contributor |
|||
has been advised of the possibility of such damages. |
|||
|
|||
9. Accepting Warranty or Additional Liability. While redistributing |
|||
the Work or Derivative Works thereof, You may choose to offer, |
|||
and charge a fee for, acceptance of support, warranty, indemnity, |
|||
or other liability obligations and/or rights consistent with this |
|||
License. However, in accepting such obligations, You may act only |
|||
on Your own behalf and on Your sole responsibility, not on behalf |
|||
of any other Contributor, and only if You agree to indemnify, |
|||
defend, and hold each Contributor harmless for any liability |
|||
incurred by, or claims asserted against, such Contributor by reason |
|||
of your accepting any such warranty or additional liability. |
|||
|
|||
END OF TERMS AND CONDITIONS |
|||
|
|||
APPENDIX: How to apply the Apache License to your work. |
|||
|
|||
To apply the Apache License to your work, attach the following |
|||
boilerplate notice, with the fields enclosed by brackets "[]" |
|||
replaced with your own identifying information. (Don't include |
|||
the brackets!) The text should be enclosed in the appropriate |
|||
comment syntax for the file format. We also recommend that a |
|||
file or class name and description of purpose be included on the |
|||
same "printed page" as the copyright notice for easier |
|||
identification within third-party archives. |
|||
|
|||
Copyright 2018 Six Labors |
|||
|
|||
Licensed under the Apache License, Version 2.0 (the "License"); |
|||
you may not use this file except in compliance with the License. |
|||
You may obtain a copy of the License at |
|||
|
|||
http://www.apache.org/licenses/LICENSE-2.0 |
|||
|
|||
Unless required by applicable law or agreed to in writing, software |
|||
distributed under the License is distributed on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
See the License for the specific language governing permissions and |
|||
limitations under the License. |
|||
@ -1,4 +0,0 @@ |
|||
#recipe Docs |
|||
Settings[Keys.Host] = "imagesharp.org"; |
|||
Settings[Keys.Title] = "Image Sharp"; |
|||
FileSystem.OutputPath = "./docs"; |
|||
@ -1,153 +0,0 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<packages> |
|||
<package id="Wyam.Docs" version="0.18.6" targetFramework="net462"> |
|||
<package id="AngleSharp" version="0.9.9" targetFramework="net462" /> |
|||
<package id="CommonServiceLocator" version="1.3" targetFramework="net462" /> |
|||
<package id="DotlessClientOnly" version="1.5.2" targetFramework="net462" /> |
|||
<package id="ManagedEsent" version="1.9.4" targetFramework="net462" /> |
|||
<package id="Markdig" version="0.10.6" targetFramework="net462" /> |
|||
<package id="Microsoft.CodeAnalysis.Analyzers" version="1.1.0" targetFramework="net462" /> |
|||
<package id="Microsoft.CodeAnalysis.Elfie" version="0.10.6" targetFramework="net462" /> |
|||
<package id="Microsoft.Composition" version="1.0.30" targetFramework="net462" /> |
|||
<package id="Microsoft.CSharp" version="4.3.0" targetFramework="net462" /> |
|||
<package id="Microsoft.DotNet.InternalAbstractions" version="1.0.0" targetFramework="net462" /> |
|||
<package id="Microsoft.DotNet.PlatformAbstractions" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.NETCore.Platforms" version="1.1.0" targetFramework="net462" /> |
|||
<package id="Microsoft.Win32.Primitives" version="4.3.0" targetFramework="net462" /> |
|||
<package id="Newtonsoft.Json" version="10.0.2" targetFramework="net462" /> |
|||
<package id="Microsoft.Extensions.DependencyModel" version="1.1.1" targetFramework="net462" /> |
|||
<package id="SharpScss" version="1.3.4" targetFramework="net462" /> |
|||
<package id="System.AppContext" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Buffers" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Collections" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Collections.Concurrent" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Collections.Immutable" version="1.3.1" targetFramework="net462" /> |
|||
<package id="System.ComponentModel" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Console" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Diagnostics.Contracts" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Diagnostics.Debug" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Diagnostics.DiagnosticSource" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Diagnostics.FileVersionInfo" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Diagnostics.StackTrace" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Diagnostics.Tools" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Diagnostics.Tracing" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Dynamic.Runtime" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Globalization" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Globalization.Calendars" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.IO" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.IO.Compression" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.IO.Compression.ZipFile" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.IO.FileSystem.Primitives" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.IO.FileSystem" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Linq" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Linq.Expressions" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Net.Primitives" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Net.Sockets" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.ObjectModel" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Reflection" version="4.3.0" targetFramework="net462" /> |
|||
<package id="ReflectionMagic" version="3.0.0" targetFramework="net462" /> |
|||
<package id="System.Reflection.Extensions" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Reflection.Metadata" version="1.4.2" targetFramework="net462" /> |
|||
<package id="System.Reflection.Primitives" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Runtime" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Runtime.CompilerServices.Unsafe" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Runtime.Extensions" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Runtime.Handles" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Runtime.Numerics" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Security.Cryptography.Algorithms" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Security.Cryptography.X509Certificates" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Net.Http" version="4.3.1" targetFramework="net462" /> |
|||
<package id="System.Text.Encoding" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Text.Encoding.CodePages" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Text.Encoding.Extensions" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Text.Encodings.Web" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Text.RegularExpressions" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Threading" version="4.3.0" targetFramework="net462" /> |
|||
<package id="ConcurrentHashSet" version="0.3.1" targetFramework="net462" /> |
|||
<package id="System.Threading.Tasks" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Threading.Tasks.Parallel" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Threading.Thread" version="4.3.0" targetFramework="net462" /> |
|||
<package id="Microsoft.Build.Framework" version="15.1.1012" targetFramework="net462" /> |
|||
<package id="Microsoft.Build" version="15.1.1012" targetFramework="net462" /> |
|||
<package id="Microsoft.Build.Utilities.Core" version="15.1.1012" targetFramework="net462" /> |
|||
<package id="Microsoft.Build.Tasks.Core" version="15.1.1012" targetFramework="net462" /> |
|||
<package id="System.Threading.Timer" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.ValueTuple" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Xml.ReaderWriter" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Xml.XDocument" version="4.3.0" targetFramework="net462" /> |
|||
<package id="NETStandard.Library" version="1.6.1" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.Cryptography.Internal" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.DataProtection.Abstractions" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.Diagnostics.Abstractions" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.Html.Abstractions" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.JsonPatch" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.Razor" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.Razor.Runtime" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.Extensions.DependencyInjection.Abstractions" version="1.1.0" targetFramework="net462" /> |
|||
<package id="Microsoft.Extensions.DependencyInjection" version="1.1.0" targetFramework="net462" /> |
|||
<package id="Microsoft.Extensions.FileSystemGlobbing" version="1.1.0" targetFramework="net462" /> |
|||
<package id="Microsoft.Extensions.Localization.Abstractions" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.Extensions.Logging.Abstractions" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.Extensions.ObjectPool" version="1.1.0" targetFramework="net462" /> |
|||
<package id="Microsoft.Extensions.PlatformAbstractions" version="1.1.0" targetFramework="net462" /> |
|||
<package id="Microsoft.Extensions.Primitives" version="1.1.0" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.Http.Features" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.Http.Abstractions" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.ResponseCaching.Abstractions" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.Routing.Abstractions" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.Extensions.Caching.Abstractions" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.Extensions.Configuration.Abstractions" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.Hosting.Server.Abstractions" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.Extensions.FileProviders.Abstractions" version="1.1.0" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.Hosting.Abstractions" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.Extensions.FileProviders.Composite" version="1.1.0" targetFramework="net462" /> |
|||
<package id="Microsoft.Extensions.FileProviders.Physical" version="1.1.0" targetFramework="net462" /> |
|||
<package id="Microsoft.Extensions.Options" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.Authorization" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.DataProtection" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.Extensions.Caching.Memory" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.Mvc.Razor.Host" version="1.1.2" targetFramework="net462" /> |
|||
<package id="Microsoft.Extensions.Localization" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.Extensions.WebEncoders" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.Net.Http.Headers" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.Http.Extensions" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.Mvc.Abstractions" version="1.1.2" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.Routing" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.WebUtilities" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.Antiforgery" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.Http" version="1.1.1" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.Mvc.Core" version="1.1.2" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.Mvc.DataAnnotations" version="1.1.2" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.Mvc.Formatters.Json" version="1.1.2" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.Mvc.ViewFeatures" version="1.1.2" targetFramework="net462" /> |
|||
<package id="System.Xml.XmlDocument" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Xml.XPath" version="4.3.0" targetFramework="net462" /> |
|||
<package id="System.Xml.XPath.XDocument" version="4.3.0" targetFramework="net462" /> |
|||
<package id="Microsoft.CodeAnalysis.Common" version="2.0.0" targetFramework="net462" /> |
|||
<package id="Microsoft.CodeAnalysis.CSharp" version="2.0.0" targetFramework="net462" /> |
|||
<package id="Microsoft.AspNetCore.Mvc.Razor" version="1.1.2" targetFramework="net462" /> |
|||
<package id="Microsoft.CodeAnalysis.VisualBasic" version="2.0.0" targetFramework="net462" /> |
|||
<package id="Microsoft.CodeAnalysis.Workspaces.Common" version="2.0.0" targetFramework="net462" /> |
|||
<package id="Microsoft.CodeAnalysis.CSharp.Workspaces" version="2.0.0" targetFramework="net462" /> |
|||
<package id="Microsoft.CodeAnalysis.VisualBasic.Workspaces" version="2.0.0" targetFramework="net462" /> |
|||
<package id="Microsoft.CodeAnalysis" version="2.0.0" targetFramework="net462" /> |
|||
<package id="Wyam.CodeAnalysis" version="0.18.6" targetFramework="net462" /> |
|||
<package id="Wyam.Feeds" version="0.18.6" targetFramework="net462" /> |
|||
<package id="Wyam.Html" version="0.18.6" targetFramework="net462" /> |
|||
<package id="Wyam.Less" version="0.18.6" targetFramework="net462" /> |
|||
<package id="Wyam.Markdown" version="0.18.6" targetFramework="net462" /> |
|||
<package id="Wyam.Razor" version="0.18.6" targetFramework="net462" /> |
|||
<package id="Wyam.Sass" version="0.18.6" targetFramework="net462" /> |
|||
<package id="Wyam.SearchIndex" version="0.18.6" targetFramework="net462" /> |
|||
<package id="YamlDotNet" version="3.9.0" targetFramework="net462" /> |
|||
<package id="YamlDotNet.Dynamic" version="3.2.3" targetFramework="net462" /> |
|||
<package id="Wyam.Yaml" version="0.18.6" targetFramework="net462" /> |
|||
<package id="Wyam.Web" version="0.18.6" targetFramework="net462" /> |
|||
</package> |
|||
<package id="Wyam.Docs.Samson" version="0.18.6" targetFramework="net462" /> |
|||
</packages> |
|||
@ -0,0 +1,21 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using System.IO; |
|||
|
|||
namespace SixLabors.ImageSharp.Formats |
|||
{ |
|||
/// <summary>
|
|||
/// Encapsulates methods used for detecting the raw image information without fully decoding it.
|
|||
/// </summary>
|
|||
public interface IImageInfoDetector |
|||
{ |
|||
/// <summary>
|
|||
/// Reads the raw image information from the specified stream.
|
|||
/// </summary>
|
|||
/// <param name="configuration">The configuration for the image.</param>
|
|||
/// <param name="stream">The <see cref="Stream"/> containing image data.</param>
|
|||
/// <returns>The <see cref="PixelTypeInfo"/> object</returns>
|
|||
IImageInfo Identify(Configuration configuration, Stream stream); |
|||
} |
|||
} |
|||
@ -0,0 +1,25 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
namespace SixLabors.ImageSharp.Formats |
|||
{ |
|||
/// <summary>
|
|||
/// Contains information about the pixels that make up an images visual data.
|
|||
/// </summary>
|
|||
public class PixelTypeInfo |
|||
{ |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="PixelTypeInfo"/> class.
|
|||
/// </summary>
|
|||
/// <param name="bitsPerPixel">Color depth, in number of bits per pixel.</param>
|
|||
internal PixelTypeInfo(int bitsPerPixel) |
|||
{ |
|||
this.BitsPerPixel = bitsPerPixel; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets color depth, in number of bits per pixel.
|
|||
/// </summary>
|
|||
public int BitsPerPixel { get; } |
|||
} |
|||
} |
|||
@ -0,0 +1,12 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
namespace SixLabors.ImageSharp |
|||
{ |
|||
/// <summary>
|
|||
/// Encapsulates the properties and methods that describe an image.
|
|||
/// </summary>
|
|||
public interface IImage : IImageInfo |
|||
{ |
|||
} |
|||
} |
|||
@ -0,0 +1,35 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using SixLabors.ImageSharp.Formats; |
|||
using SixLabors.ImageSharp.MetaData; |
|||
|
|||
namespace SixLabors.ImageSharp |
|||
{ |
|||
/// <summary>
|
|||
/// Encapsulates properties that descibe basic image information including dimensions, pixel type information
|
|||
/// and additional metadata
|
|||
/// </summary>
|
|||
public interface IImageInfo |
|||
{ |
|||
/// <summary>
|
|||
/// Gets information about the image pixels.
|
|||
/// </summary>
|
|||
PixelTypeInfo PixelType { get; } |
|||
|
|||
/// <summary>
|
|||
/// Gets the width.
|
|||
/// </summary>
|
|||
int Width { get; } |
|||
|
|||
/// <summary>
|
|||
/// Gets the height.
|
|||
/// </summary>
|
|||
int Height { get; } |
|||
|
|||
/// <summary>
|
|||
/// Gets the metadata of the image.
|
|||
/// </summary>
|
|||
ImageMetaData MetaData { get; } |
|||
} |
|||
} |
|||
@ -0,0 +1,41 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using SixLabors.ImageSharp.Formats; |
|||
using SixLabors.ImageSharp.MetaData; |
|||
|
|||
namespace SixLabors.ImageSharp |
|||
{ |
|||
/// <summary>
|
|||
/// Contains information about the image including dimensions, pixel type information and additional metadata
|
|||
/// </summary>
|
|||
internal sealed class ImageInfo : IImageInfo |
|||
{ |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="ImageInfo"/> class.
|
|||
/// </summary>
|
|||
/// <param name="pixelType">The image pixel type information.</param>
|
|||
/// <param name="width">The width of the image in pixels.</param>
|
|||
/// <param name="height">The height of the image in pixels.</param>
|
|||
/// <param name="metaData">The images metadata.</param>
|
|||
public ImageInfo(PixelTypeInfo pixelType, int width, int height, ImageMetaData metaData) |
|||
{ |
|||
this.PixelType = pixelType; |
|||
this.Width = width; |
|||
this.Height = height; |
|||
this.MetaData = metaData; |
|||
} |
|||
|
|||
/// <inheritdoc />
|
|||
public PixelTypeInfo PixelType { get; } |
|||
|
|||
/// <inheritdoc />
|
|||
public int Width { get; } |
|||
|
|||
/// <inheritdoc />
|
|||
public int Height { get; } |
|||
|
|||
/// <inheritdoc />
|
|||
public ImageMetaData MetaData { get; } |
|||
} |
|||
} |
|||
@ -0,0 +1,446 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using System; |
|||
using System.Numerics; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing |
|||
{ |
|||
/// <summary>
|
|||
/// Provides extensions methods for the <see cref="Matrix4x4"/> struct
|
|||
/// </summary>
|
|||
public static class MatrixFilters |
|||
{ |
|||
/// <summary>
|
|||
/// Gets a filter recreating Achromatomaly (Color desensitivity) color blindness
|
|||
/// </summary>
|
|||
public static Matrix4x4 AchromatomalyFilter { get; } = new Matrix4x4 |
|||
{ |
|||
M11 = .618F, |
|||
M12 = .163F, |
|||
M13 = .163F, |
|||
M21 = .320F, |
|||
M22 = .775F, |
|||
M23 = .320F, |
|||
M31 = .062F, |
|||
M32 = .062F, |
|||
M33 = .516F, |
|||
M44 = 1 |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Gets a filter recreating Achromatopsia (Monochrome) color blindness.
|
|||
/// </summary>
|
|||
public static Matrix4x4 AchromatopsiaFilter { get; } = new Matrix4x4 |
|||
{ |
|||
M11 = .299F, |
|||
M12 = .299F, |
|||
M13 = .299F, |
|||
M21 = .587F, |
|||
M22 = .587F, |
|||
M23 = .587F, |
|||
M31 = .114F, |
|||
M32 = .114F, |
|||
M33 = .114F, |
|||
M44 = 1 |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Gets a filter recreating Deuteranomaly (Green-Weak) color blindness.
|
|||
/// </summary>
|
|||
public static Matrix4x4 DeuteranomalyFilter { get; } = new Matrix4x4 |
|||
{ |
|||
M11 = 0.8F, |
|||
M12 = 0.258F, |
|||
M21 = 0.2F, |
|||
M22 = 0.742F, |
|||
M23 = 0.142F, |
|||
M33 = 0.858F, |
|||
M44 = 1 |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Gets a filter recreating Deuteranopia (Green-Blind) color blindness.
|
|||
/// </summary>
|
|||
public static Matrix4x4 DeuteranopiaFilter { get; } = new Matrix4x4 |
|||
{ |
|||
M11 = 0.625F, |
|||
M12 = 0.7F, |
|||
M21 = 0.375F, |
|||
M22 = 0.3F, |
|||
M23 = 0.3F, |
|||
M33 = 0.7F, |
|||
M44 = 1 |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Gets a filter recreating Protanomaly (Red-Weak) color blindness.
|
|||
/// </summary>
|
|||
public static Matrix4x4 ProtanomalyFilter { get; } = new Matrix4x4 |
|||
{ |
|||
M11 = 0.817F, |
|||
M12 = 0.333F, |
|||
M21 = 0.183F, |
|||
M22 = 0.667F, |
|||
M23 = 0.125F, |
|||
M33 = 0.875F, |
|||
M44 = 1 |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Gets a filter recreating Protanopia (Red-Blind) color blindness.
|
|||
/// </summary>
|
|||
public static Matrix4x4 ProtanopiaFilter { get; } = new Matrix4x4 |
|||
{ |
|||
M11 = 0.567F, |
|||
M12 = 0.558F, |
|||
M21 = 0.433F, |
|||
M22 = 0.442F, |
|||
M23 = 0.242F, |
|||
M33 = 0.758F, |
|||
M44 = 1 |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Gets a filter recreating Tritanomaly (Blue-Weak) color blindness.
|
|||
/// </summary>
|
|||
public static Matrix4x4 TritanomalyFilter { get; } = new Matrix4x4 |
|||
{ |
|||
M11 = 0.967F, |
|||
M21 = 0.33F, |
|||
M22 = 0.733F, |
|||
M23 = 0.183F, |
|||
M32 = 0.267F, |
|||
M33 = 0.817F, |
|||
M44 = 1 |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Gets a filter recreating Tritanopia (Blue-Blind) color blindness.
|
|||
/// </summary>
|
|||
public static Matrix4x4 TritanopiaFilter { get; } = new Matrix4x4 |
|||
{ |
|||
M11 = 0.95F, |
|||
M21 = 0.05F, |
|||
M22 = 0.433F, |
|||
M23 = 0.475F, |
|||
M32 = 0.567F, |
|||
M33 = 0.525F, |
|||
M44 = 1 |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Gets an approximated black and white filter
|
|||
/// </summary>
|
|||
public static Matrix4x4 BlackWhiteFilter { get; } = new Matrix4x4() |
|||
{ |
|||
M11 = 1.5F, |
|||
M12 = 1.5F, |
|||
M13 = 1.5F, |
|||
M21 = 1.5F, |
|||
M22 = 1.5F, |
|||
M23 = 1.5F, |
|||
M31 = 1.5F, |
|||
M32 = 1.5F, |
|||
M33 = 1.5F, |
|||
M41 = -1F, |
|||
M42 = -1F, |
|||
M43 = -1F, |
|||
M44 = 1 |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Gets a filter recreating an old Kodachrome camera effect.
|
|||
/// </summary>
|
|||
public static Matrix4x4 KodachromeFilter { get; } = new Matrix4x4 |
|||
{ |
|||
M11 = 0.7297023F, |
|||
M22 = 0.6109577F, |
|||
M33 = 0.597218F, |
|||
M41 = 0.105F, |
|||
M42 = 0.145F, |
|||
M43 = 0.155F, |
|||
M44 = 1 |
|||
} |
|||
|
|||
* CreateSaturateFilter(1.2F) * CreateContrastFilter(1.35F); |
|||
|
|||
/// <summary>
|
|||
/// Gets a filter recreating an old Lomograph camera effect.
|
|||
/// </summary>
|
|||
public static Matrix4x4 LomographFilter { get; } = new Matrix4x4 |
|||
{ |
|||
M11 = 1.5F, |
|||
M22 = 1.45F, |
|||
M33 = 1.16F, |
|||
M41 = -.1F, |
|||
M42 = -.02F, |
|||
M43 = -.07F, |
|||
M44 = 1 |
|||
} |
|||
|
|||
* CreateSaturateFilter(1.1F) * CreateContrastFilter(1.33F); |
|||
|
|||
/// <summary>
|
|||
/// Gets a filter recreating an old Polaroid camera effect.
|
|||
/// </summary>
|
|||
public static Matrix4x4 PolaroidFilter { get; } = new Matrix4x4 |
|||
{ |
|||
M11 = 1.538F, |
|||
M12 = -0.062F, |
|||
M13 = -0.262F, |
|||
M21 = -0.022F, |
|||
M22 = 1.578F, |
|||
M23 = -0.022F, |
|||
M31 = .216F, |
|||
M32 = -.16F, |
|||
M33 = 1.5831F, |
|||
M41 = 0.02F, |
|||
M42 = -0.05F, |
|||
M43 = -0.05F, |
|||
M44 = 1 |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Create a brightness filter matrix using the given amount.
|
|||
/// </summary>
|
|||
/// <remarks>
|
|||
/// A value of 0 will create an image that is completely black. A value of 1 leaves the input unchanged.
|
|||
/// Other values are linear multipliers on the effect. Values of an amount over 1 are allowed, providing brighter results.
|
|||
/// </remarks>
|
|||
/// <param name="amount">The proportion of the conversion. Must be greater than or equal to 0.</param>
|
|||
/// <returns>The <see cref="Matrix4x4"/></returns>
|
|||
public static Matrix4x4 CreateBrightnessFilter(float amount) |
|||
{ |
|||
Guard.MustBeGreaterThanOrEqualTo(amount, 0, nameof(amount)); |
|||
|
|||
// See https://cs.chromium.org/chromium/src/cc/paint/render_surface_filters.cc
|
|||
return new Matrix4x4 |
|||
{ |
|||
M11 = amount, |
|||
M22 = amount, |
|||
M33 = amount, |
|||
M44 = 1 |
|||
}; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Create a contrast filter matrix using the given amount.
|
|||
/// </summary>
|
|||
/// <remarks>
|
|||
/// A value of 0 will create an image that is completely gray. A value of 1 leaves the input unchanged.
|
|||
/// Other values are linear multipliers on the effect. Values of an amount over 1 are allowed, providing results with more contrast.
|
|||
/// </remarks>
|
|||
/// <param name="amount">The proportion of the conversion. Must be greater than or equal to 0.</param>
|
|||
/// <returns>The <see cref="Matrix4x4"/></returns>
|
|||
public static Matrix4x4 CreateContrastFilter(float amount) |
|||
{ |
|||
Guard.MustBeGreaterThanOrEqualTo(amount, 0, nameof(amount)); |
|||
|
|||
// See https://cs.chromium.org/chromium/src/cc/paint/render_surface_filters.cc
|
|||
float contrast = (-.5F * amount) + .5F; |
|||
|
|||
return new Matrix4x4 |
|||
{ |
|||
M11 = amount, |
|||
M22 = amount, |
|||
M33 = amount, |
|||
M41 = contrast, |
|||
M42 = contrast, |
|||
M43 = contrast, |
|||
M44 = 1 |
|||
}; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Create a greyscale filter matrix using the given amount using the formula as specified by ITU-R Recommendation BT.601.
|
|||
/// <see href="https://en.wikipedia.org/wiki/Luma_%28video%29#Rec._601_luma_versus_Rec._709_luma_coefficients"/>
|
|||
/// </summary>
|
|||
/// <param name="amount">The proportion of the conversion. Must be between 0 and 1.</param>
|
|||
/// <returns>The <see cref="Matrix4x4"/></returns>
|
|||
public static Matrix4x4 CreateGrayscaleBt601Filter(float amount) |
|||
{ |
|||
Guard.MustBeBetweenOrEqualTo(amount, 0, 1, nameof(amount)); |
|||
amount = 1F - amount; |
|||
|
|||
// https://cs.chromium.org/chromium/src/cc/paint/render_surface_filters.cc
|
|||
return new Matrix4x4 |
|||
{ |
|||
M11 = .299F + (.701F * amount), |
|||
M12 = .299F - (.299F * amount), |
|||
M13 = .299F - (.299F * amount), |
|||
M21 = .587F - (.587F * amount), |
|||
M22 = .587F + (.413F * amount), |
|||
M23 = .587F - (.587F * amount), |
|||
M31 = .114F - (.114F * amount), |
|||
M32 = .114F - (.114F * amount), |
|||
M33 = .114F + (.886F * amount), |
|||
M44 = 1 |
|||
}; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Create a greyscale filter matrix using the given amount using the formula as specified by ITU-R Recommendation BT.709.
|
|||
/// <see href="https://en.wikipedia.org/wiki/Rec._709#Luma_coefficients"/>
|
|||
/// </summary>
|
|||
/// <param name="amount">The proportion of the conversion. Must be between 0 and 1.</param>
|
|||
/// <returns>The <see cref="Matrix4x4"/></returns>
|
|||
public static Matrix4x4 CreateGrayscaleBt709Filter(float amount) |
|||
{ |
|||
Guard.MustBeBetweenOrEqualTo(amount, 0, 1, nameof(amount)); |
|||
amount = 1F - amount; |
|||
|
|||
// https://cs.chromium.org/chromium/src/cc/paint/render_surface_filters.cc
|
|||
return new Matrix4x4 |
|||
{ |
|||
M11 = .2126F + (.7874F * amount), |
|||
M12 = .2126F - (.2126F * amount), |
|||
M13 = .2126F - (.2126F * amount), |
|||
M21 = .7152F - (.7152F * amount), |
|||
M22 = .7152F + (.2848F * amount), |
|||
M23 = .7152F - (.7152F * amount), |
|||
M31 = .0722F - (.0722F * amount), |
|||
M32 = .0722F - (.0722F * amount), |
|||
M33 = .0722F + (.9278F * amount), |
|||
M44 = 1 |
|||
}; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Create a hue filter matrix using the given angle in degrees.
|
|||
/// </summary>
|
|||
/// <param name="degrees">The angle of rotation in degrees.</param>
|
|||
/// <returns>The <see cref="Matrix4x4"/></returns>
|
|||
public static Matrix4x4 CreateHueFilter(float degrees) |
|||
{ |
|||
// Wrap the angle round at 360.
|
|||
degrees = degrees % 360; |
|||
|
|||
// Make sure it's not negative.
|
|||
while (degrees < 0) |
|||
{ |
|||
degrees += 360; |
|||
} |
|||
|
|||
float radian = MathFExtensions.DegreeToRadian(degrees); |
|||
float cosRadian = MathF.Cos(radian); |
|||
float sinRadian = MathF.Sin(radian); |
|||
|
|||
// The matrix is set up to preserve the luminance of the image.
|
|||
// See http://graficaobscura.com/matrix/index.html
|
|||
// Number are taken from https://msdn.microsoft.com/en-us/library/jj192162(v=vs.85).aspx
|
|||
return new Matrix4x4 |
|||
{ |
|||
M11 = .213F + (cosRadian * .787F) - (sinRadian * .213F), |
|||
M12 = .213F - (cosRadian * .213F) - (sinRadian * 0.143F), |
|||
M13 = .213F - (cosRadian * .213F) - (sinRadian * .787F), |
|||
M21 = .715F - (cosRadian * .715F) - (sinRadian * .715F), |
|||
M22 = .715F + (cosRadian * .285F) + (sinRadian * 0.140F), |
|||
M23 = .715F - (cosRadian * .715F) + (sinRadian * .715F), |
|||
M31 = .072F - (cosRadian * .072F) + (sinRadian * .928F), |
|||
M32 = .072F - (cosRadian * .072F) - (sinRadian * 0.283F), |
|||
M33 = .072F + (cosRadian * .928F) + (sinRadian * .072F), |
|||
M44 = 1 |
|||
}; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Create an invert filter matrix using the given amount.
|
|||
/// </summary>
|
|||
/// <param name="amount">The proportion of the conversion. Must be between 0 and 1.</param>
|
|||
/// <returns>The <see cref="Matrix4x4"/></returns>
|
|||
public static Matrix4x4 CreateInvertFilter(float amount) |
|||
{ |
|||
Guard.MustBeBetweenOrEqualTo(amount, 0, 1, nameof(amount)); |
|||
|
|||
// See https://cs.chromium.org/chromium/src/cc/paint/render_surface_filters.cc
|
|||
float invert = 1F - (2F * amount); |
|||
|
|||
return new Matrix4x4 |
|||
{ |
|||
M11 = invert, |
|||
M22 = invert, |
|||
M33 = invert, |
|||
M41 = amount, |
|||
M42 = amount, |
|||
M43 = amount, |
|||
M44 = 1 |
|||
}; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Create an opacity filter matrix using the given amount.
|
|||
/// </summary>
|
|||
/// <param name="amount">The proportion of the conversion. Must be between 0 and 1.</param>
|
|||
/// <returns>The <see cref="Matrix4x4"/></returns>
|
|||
public static Matrix4x4 CreateOpacityFilter(float amount) |
|||
{ |
|||
Guard.MustBeBetweenOrEqualTo(amount, 0, 1, nameof(amount)); |
|||
|
|||
// See https://cs.chromium.org/chromium/src/cc/paint/render_surface_filters.cc
|
|||
return new Matrix4x4 |
|||
{ |
|||
M11 = 1, |
|||
M22 = 1, |
|||
M33 = 1, |
|||
M44 = amount |
|||
}; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Create a saturation filter matrix using the given amount.
|
|||
/// </summary>
|
|||
/// <remarks>
|
|||
/// A value of 0 is completely un-saturated. A value of 1 leaves the input unchanged.
|
|||
/// Other values are linear multipliers on the effect. Values of amount over 1 are allowed, providing super-saturated results
|
|||
/// </remarks>
|
|||
/// <param name="amount">The proportion of the conversion. Must be greater than or equal to 0.</param>
|
|||
/// <returns>The <see cref="Matrix4x4"/></returns>
|
|||
public static Matrix4x4 CreateSaturateFilter(float amount) |
|||
{ |
|||
Guard.MustBeGreaterThanOrEqualTo(amount, 0, nameof(amount)); |
|||
|
|||
// See https://cs.chromium.org/chromium/src/cc/paint/render_surface_filters.cc
|
|||
return new Matrix4x4 |
|||
{ |
|||
M11 = .213F + (.787F * amount), |
|||
M12 = .213F - (.213F * amount), |
|||
M13 = .213F - (.213F * amount), |
|||
M21 = .715F - (.715F * amount), |
|||
M22 = .715F + (.285F * amount), |
|||
M23 = .715F - (.715F * amount), |
|||
M31 = 1F - ((.213F + (.787F * amount)) + (.715F - (.715F * amount))), |
|||
M32 = 1F - ((.213F - (.213F * amount)) + (.715F + (.285F * amount))), |
|||
M33 = 1F - ((.213F - (.213F * amount)) + (.715F - (.715F * amount))), |
|||
M44 = 1 |
|||
}; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Create a sepia filter matrix using the given amount.
|
|||
/// The formula used matches the svg specification. <see href="http://www.w3.org/TR/filter-effects/#sepiaEquivalent"/>
|
|||
/// </summary>
|
|||
/// <param name="amount">The proportion of the conversion. Must be between 0 and 1.</param>
|
|||
/// <returns>The <see cref="Matrix4x4"/></returns>
|
|||
public static Matrix4x4 CreateSepiaFilter(float amount) |
|||
{ |
|||
Guard.MustBeBetweenOrEqualTo(amount, 0, 1, nameof(amount)); |
|||
amount = 1F - amount; |
|||
|
|||
// See https://cs.chromium.org/chromium/src/cc/paint/render_surface_filters.cc
|
|||
return new Matrix4x4 |
|||
{ |
|||
M11 = .393F + (.607F * amount), |
|||
M12 = .349F - (.349F * amount), |
|||
M13 = .272F - (.272F * amount), |
|||
M21 = .769F - (.769F * amount), |
|||
M22 = .686F + (.314F * amount), |
|||
M23 = .534F - (.534F * amount), |
|||
M31 = .189F - (.189F * amount), |
|||
M32 = .168F - (.168F * amount), |
|||
M33 = .131F + (.869F * amount), |
|||
M44 = 1 |
|||
}; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,54 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
using SixLabors.ImageSharp.Processing.Processors; |
|||
using SixLabors.Primitives; |
|||
|
|||
namespace SixLabors.ImageSharp |
|||
{ |
|||
/// <summary>
|
|||
/// Extension methods for the <see cref="Image{TPixel}"/> type.
|
|||
/// </summary>
|
|||
public static partial class ImageExtensions |
|||
{ |
|||
/// <summary>
|
|||
/// Alters the saturation component of the image.
|
|||
/// </summary>
|
|||
/// <remarks>
|
|||
/// A value of 0 is completely un-saturated. A value of 1 leaves the input unchanged.
|
|||
/// Other values are linear multipliers on the effect. Values of amount over 1 are allowed, providing super-saturated results
|
|||
/// </remarks>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
/// <param name="source">The image this method extends.</param>
|
|||
/// <param name="amount">The proportion of the conversion. Must be greater than or equal to 0.</param>
|
|||
/// <returns>The <see cref="Image{TPixel}"/>.</returns>
|
|||
public static IImageProcessingContext<TPixel> Saturate<TPixel>(this IImageProcessingContext<TPixel> source, float amount) |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
source.ApplyProcessor(new SaturateProcessor<TPixel>(amount)); |
|||
return source; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Alters the saturation component of the image.
|
|||
/// </summary>
|
|||
/// <remarks>
|
|||
/// A value of 0 is completely un-saturated. A value of 1 leaves the input unchanged.
|
|||
/// Other values are linear multipliers on the effect. Values of amount over 1 are allowed, providing super-saturated results
|
|||
/// </remarks>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
/// <param name="source">The image this method extends.</param>
|
|||
/// <param name="amount">The proportion of the conversion. Must be greater than or equal to 0.</param>
|
|||
/// <param name="rectangle">
|
|||
/// The <see cref="Rectangle"/> structure that specifies the portion of the image object to alter.
|
|||
/// </param>
|
|||
/// <returns>The <see cref="Image{TPixel}"/>.</returns>
|
|||
public static IImageProcessingContext<TPixel> Saturate<TPixel>(this IImageProcessingContext<TPixel> source, float amount, Rectangle rectangle) |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
source.ApplyProcessor(new SaturateProcessor<TPixel>(amount), rectangle); |
|||
return source; |
|||
} |
|||
} |
|||
} |
|||
@ -1,34 +0,0 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using System.Numerics; |
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Converts the colors of the image to their black and white equivalent.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class BlackWhiteProcessor<TPixel> : ColorMatrixProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <inheritdoc/>
|
|||
public override Matrix4x4 Matrix => new Matrix4x4() |
|||
{ |
|||
M11 = 1.5F, |
|||
M12 = 1.5F, |
|||
M13 = 1.5F, |
|||
M21 = 1.5F, |
|||
M22 = 1.5F, |
|||
M23 = 1.5F, |
|||
M31 = 1.5F, |
|||
M32 = 1.5F, |
|||
M33 = 1.5F, |
|||
M41 = -1F, |
|||
M42 = -1F, |
|||
M43 = -1F, |
|||
M44 = 1 |
|||
}; |
|||
} |
|||
} |
|||
@ -1,34 +0,0 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using System.Numerics; |
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Converts the colors of the image recreating Achromatomaly (Color desensitivity) color blindness.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class AchromatomalyProcessor<TPixel> : ColorMatrixProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <inheritdoc/>
|
|||
public override Matrix4x4 Matrix => new Matrix4x4 |
|||
{ |
|||
M11 = .618F, |
|||
M12 = .163F, |
|||
M13 = .163F, |
|||
M21 = .320F, |
|||
M22 = .775F, |
|||
M23 = .320F, |
|||
M31 = .062F, |
|||
M32 = .062F, |
|||
M33 = .516F, |
|||
M44 = 1 |
|||
}; |
|||
|
|||
/// <inheritdoc/>
|
|||
public override bool Compand => false; |
|||
} |
|||
} |
|||
@ -1,34 +0,0 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using System.Numerics; |
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Converts the colors of the image recreating Achromatopsia (Monochrome) color blindness.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class AchromatopsiaProcessor<TPixel> : ColorMatrixProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <inheritdoc/>
|
|||
public override Matrix4x4 Matrix => new Matrix4x4 |
|||
{ |
|||
M11 = .299F, |
|||
M12 = .299F, |
|||
M13 = .299F, |
|||
M21 = .587F, |
|||
M22 = .587F, |
|||
M23 = .587F, |
|||
M31 = .114F, |
|||
M32 = .114F, |
|||
M33 = .114F, |
|||
M44 = 1 |
|||
}; |
|||
|
|||
/// <inheritdoc/>
|
|||
public override bool Compand => false; |
|||
} |
|||
} |
|||
@ -1,31 +0,0 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using System.Numerics; |
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Converts the colors of the image recreating Protanopia (Red-Weak) color blindness.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class ProtanomalyProcessor<TPixel> : ColorMatrixProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <inheritdoc/>
|
|||
public override Matrix4x4 Matrix => new Matrix4x4 |
|||
{ |
|||
M11 = 0.817F, |
|||
M12 = 0.333F, |
|||
M21 = 0.183F, |
|||
M22 = 0.667F, |
|||
M23 = 0.125F, |
|||
M33 = 0.875F, |
|||
M44 = 1 |
|||
}; |
|||
|
|||
/// <inheritdoc/>
|
|||
public override bool Compand => false; |
|||
} |
|||
} |
|||
@ -1,78 +0,0 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using System; |
|||
using System.Numerics; |
|||
using System.Threading.Tasks; |
|||
using SixLabors.ImageSharp.Advanced; |
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
using SixLabors.Primitives; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// The color matrix filter. Inherit from this class to perform operation involving color matrices.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal abstract class ColorMatrixProcessor<TPixel> : ImageProcessor<TPixel>, IColorMatrixProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <inheritdoc/>
|
|||
public abstract Matrix4x4 Matrix { get; } |
|||
|
|||
/// <inheritdoc/>
|
|||
public virtual bool Compand { get; set; } = true; |
|||
|
|||
/// <inheritdoc/>
|
|||
protected override void OnApply(ImageFrame<TPixel> source, Rectangle sourceRectangle, Configuration configuration) |
|||
{ |
|||
int startY = sourceRectangle.Y; |
|||
int endY = sourceRectangle.Bottom; |
|||
int startX = sourceRectangle.X; |
|||
int endX = sourceRectangle.Right; |
|||
|
|||
// Align start/end positions.
|
|||
int minX = Math.Max(0, startX); |
|||
int maxX = Math.Min(source.Width, endX); |
|||
int minY = Math.Max(0, startY); |
|||
int maxY = Math.Min(source.Height, endY); |
|||
|
|||
// Reset offset if necessary.
|
|||
if (minX > 0) |
|||
{ |
|||
startX = 0; |
|||
} |
|||
|
|||
if (minY > 0) |
|||
{ |
|||
startY = 0; |
|||
} |
|||
|
|||
Matrix4x4 matrix = this.Matrix; |
|||
bool compand = this.Compand; |
|||
|
|||
Parallel.For( |
|||
minY, |
|||
maxY, |
|||
configuration.ParallelOptions, |
|||
y => |
|||
{ |
|||
Span<TPixel> row = source.GetPixelRowSpan(y - startY); |
|||
|
|||
for (int x = minX; x < maxX; x++) |
|||
{ |
|||
ref TPixel pixel = ref row[x - startX]; |
|||
var vector = pixel.ToVector4(); |
|||
|
|||
if (compand) |
|||
{ |
|||
vector = vector.Expand(); |
|||
} |
|||
|
|||
vector = Vector4.Transform(vector, matrix); |
|||
pixel.PackFromVector4(compand ? vector.Compress() : vector); |
|||
} |
|||
}); |
|||
} |
|||
} |
|||
} |
|||
@ -1,32 +0,0 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using System.Numerics; |
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Converts the colors of the image to Grayscale applying the formula as specified by ITU-R Recommendation BT.601
|
|||
/// <see href="https://en.wikipedia.org/wiki/Luma_%28video%29#Rec._601_luma_versus_Rec._709_luma_coefficients"/>.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class GrayscaleBt601Processor<TPixel> : ColorMatrixProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <inheritdoc/>
|
|||
public override Matrix4x4 Matrix => new Matrix4x4 |
|||
{ |
|||
M11 = .299F, |
|||
M12 = .299F, |
|||
M13 = .299F, |
|||
M21 = .587F, |
|||
M22 = .587F, |
|||
M23 = .587F, |
|||
M31 = .114F, |
|||
M32 = .114F, |
|||
M33 = .114F, |
|||
M44 = 1 |
|||
}; |
|||
} |
|||
} |
|||
@ -1,32 +0,0 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using System.Numerics; |
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Converts the colors of the image to Grayscale applying the formula as specified by ITU-R Recommendation BT.709
|
|||
/// <see href="https://en.wikipedia.org/wiki/Rec._709#Luma_coefficients"/>.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class GrayscaleBt709Processor<TPixel> : ColorMatrixProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <inheritdoc/>
|
|||
public override Matrix4x4 Matrix => new Matrix4x4 |
|||
{ |
|||
M11 = .2126F, |
|||
M12 = .2126F, |
|||
M13 = .2126F, |
|||
M21 = .7152F, |
|||
M22 = .7152F, |
|||
M23 = .7152F, |
|||
M31 = .0722F, |
|||
M32 = .0722F, |
|||
M33 = .0722F, |
|||
M44 = 1 |
|||
}; |
|||
} |
|||
} |
|||
@ -1,77 +0,0 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using System; |
|||
using System.Numerics; |
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// An <see cref="ImageProcessor{TPixel}"/> to change the hue of an <see cref="Image{TPixel}"/>.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class HueProcessor<TPixel> : ColorMatrixProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="HueProcessor{TPixel}"/> class.
|
|||
/// </summary>
|
|||
/// <param name="angle">The new brightness of the image. Must be between -100 and 100.</param>
|
|||
public HueProcessor(float angle) |
|||
{ |
|||
// Wrap the angle round at 360.
|
|||
angle = angle % 360; |
|||
|
|||
// Make sure it's not negative.
|
|||
while (angle < 0) |
|||
{ |
|||
angle += 360; |
|||
} |
|||
|
|||
this.Angle = angle; |
|||
|
|||
float radians = MathFExtensions.DegreeToRadian(angle); |
|||
float cosradians = MathF.Cos(radians); |
|||
float sinradians = MathF.Sin(radians); |
|||
|
|||
float lumR = .213F; |
|||
float lumG = .715F; |
|||
float lumB = .072F; |
|||
|
|||
float oneMinusLumR = 1 - lumR; |
|||
float oneMinusLumG = 1 - lumG; |
|||
float oneMinusLumB = 1 - lumB; |
|||
|
|||
// The matrix is set up to preserve the luminance of the image.
|
|||
// See http://graficaobscura.com/matrix/index.html
|
|||
// Number are taken from https://msdn.microsoft.com/en-us/library/jj192162(v=vs.85).aspx
|
|||
var matrix4X4 = new Matrix4x4 |
|||
{ |
|||
M11 = lumR + (cosradians * oneMinusLumR) - (sinradians * lumR), |
|||
M12 = lumR - (cosradians * lumR) - (sinradians * 0.143F), |
|||
M13 = lumR - (cosradians * lumR) - (sinradians * oneMinusLumR), |
|||
M21 = lumG - (cosradians * lumG) - (sinradians * lumG), |
|||
M22 = lumG + (cosradians * oneMinusLumG) + (sinradians * 0.140F), |
|||
M23 = lumG - (cosradians * lumG) + (sinradians * lumG), |
|||
M31 = lumB - (cosradians * lumB) + (sinradians * oneMinusLumB), |
|||
M32 = lumB - (cosradians * lumB) - (sinradians * 0.283F), |
|||
M33 = lumB + (cosradians * oneMinusLumB) + (sinradians * lumB), |
|||
M44 = 1 |
|||
}; |
|||
|
|||
this.Matrix = matrix4X4; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the rotation value.
|
|||
/// </summary>
|
|||
public float Angle { get; } |
|||
|
|||
/// <inheritdoc/>
|
|||
public override Matrix4x4 Matrix { get; } |
|||
|
|||
/// <inheritdoc/>
|
|||
public override bool Compand => false; |
|||
} |
|||
} |
|||
@ -1,27 +0,0 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using System.Numerics; |
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Encapsulates properties and methods for creating processors that utilize a matrix to
|
|||
/// alter the image pixels.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal interface IColorMatrixProcessor<TPixel> : IImageProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <summary>
|
|||
/// Gets the <see cref="Matrix4x4"/> used to alter the image.
|
|||
/// </summary>
|
|||
Matrix4x4 Matrix { get; } |
|||
|
|||
/// <summary>
|
|||
/// Gets or sets a value indicating whether to compress or expand individual pixel color values on processing.
|
|||
/// </summary>
|
|||
bool Compand { get; set; } |
|||
} |
|||
} |
|||
@ -1,28 +0,0 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using System.Numerics; |
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Converts the colors of the image recreating an old Kodachrome camera effect.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class KodachromeProcessor<TPixel> : ColorMatrixProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <inheritdoc/>
|
|||
public override Matrix4x4 Matrix => new Matrix4x4 |
|||
{ |
|||
M11 = 0.6997023F, |
|||
M22 = 0.4609577F, |
|||
M33 = 0.397218F, |
|||
M41 = 0.005F, |
|||
M42 = -0.005F, |
|||
M43 = 0.005F, |
|||
M44 = 1 |
|||
}; |
|||
} |
|||
} |
|||
@ -1,66 +0,0 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using System.Numerics; |
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// An <see cref="ImageProcessor{TPixel}"/> to change the saturation of an <see cref="Image{TPixel}"/>.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class SaturationProcessor<TPixel> : ColorMatrixProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="SaturationProcessor{TPixel}"/> class.
|
|||
/// </summary>
|
|||
/// <param name="saturation">The new saturation of the image. Must be between -100 and 100.</param>
|
|||
/// <exception cref="System.ArgumentException">
|
|||
/// <paramref name="saturation"/> is less than -100 or is greater than 100.
|
|||
/// </exception>
|
|||
public SaturationProcessor(int saturation) |
|||
{ |
|||
this.Amount = saturation; |
|||
Guard.MustBeBetweenOrEqualTo(saturation, -100, 100, nameof(saturation)); |
|||
float saturationFactor = saturation / 100F; |
|||
|
|||
// Stop at -1 to prevent inversion.
|
|||
saturationFactor++; |
|||
|
|||
// The matrix is set up to "shear" the color space using the following set of values.
|
|||
// Note that each color component has an effective luminance which contributes to the
|
|||
// overall brightness of the pixel.
|
|||
// See http://graficaobscura.com/matrix/index.html
|
|||
float saturationComplement = 1.0f - saturationFactor; |
|||
float saturationComplementR = 0.3086f * saturationComplement; |
|||
float saturationComplementG = 0.6094f * saturationComplement; |
|||
float saturationComplementB = 0.0820f * saturationComplement; |
|||
|
|||
var matrix4X4 = new Matrix4x4 |
|||
{ |
|||
M11 = saturationComplementR + saturationFactor, |
|||
M12 = saturationComplementR, |
|||
M13 = saturationComplementR, |
|||
M21 = saturationComplementG, |
|||
M22 = saturationComplementG + saturationFactor, |
|||
M23 = saturationComplementG, |
|||
M31 = saturationComplementB, |
|||
M32 = saturationComplementB, |
|||
M33 = saturationComplementB + saturationFactor, |
|||
M44 = 1 |
|||
}; |
|||
|
|||
this.Matrix = matrix4X4; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the amount to apply.
|
|||
/// </summary>
|
|||
public int Amount { get; } |
|||
|
|||
/// <inheritdoc/>
|
|||
public override Matrix4x4 Matrix { get; } |
|||
} |
|||
} |
|||
@ -1,35 +0,0 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using System.Numerics; |
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Converts the colors of the image to their sepia equivalent.
|
|||
/// The formula used matches the svg specification. <see href="http://www.w3.org/TR/filter-effects/#sepiaEquivalent"/>
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class SepiaProcessor<TPixel> : ColorMatrixProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <inheritdoc/>
|
|||
public override Matrix4x4 Matrix => new Matrix4x4 |
|||
{ |
|||
M11 = .393F, |
|||
M12 = .349F, |
|||
M13 = .272F, |
|||
M21 = .769F, |
|||
M22 = .686F, |
|||
M23 = .534F, |
|||
M31 = .189F, |
|||
M32 = .168F, |
|||
M33 = .131F, |
|||
M44 = 1 |
|||
}; |
|||
|
|||
/// <inheritdoc/>
|
|||
public override bool Compand => false; |
|||
} |
|||
} |
|||
@ -1,81 +0,0 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using System; |
|||
using System.Numerics; |
|||
using System.Threading.Tasks; |
|||
using SixLabors.ImageSharp.Advanced; |
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
using SixLabors.Primitives; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// An <see cref="IImageProcessor{TPixel}"/> to change the alpha component of an <see cref="Image{TPixel}"/>.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class AlphaProcessor<TPixel> : ImageProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="AlphaProcessor{TPixel}"/> class.
|
|||
/// </summary>
|
|||
/// <param name="percent">The percentage to adjust the opacity of the image. Must be between 0 and 1.</param>
|
|||
/// <exception cref="System.ArgumentException">
|
|||
/// <paramref name="percent"/> is less than 0 or is greater than 1.
|
|||
/// </exception>
|
|||
public AlphaProcessor(float percent) |
|||
{ |
|||
Guard.MustBeBetweenOrEqualTo(percent, 0, 1, nameof(percent)); |
|||
this.Value = percent; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the alpha value.
|
|||
/// </summary>
|
|||
public float Value { get; } |
|||
|
|||
/// <inheritdoc/>
|
|||
protected override void OnApply(ImageFrame<TPixel> source, Rectangle sourceRectangle, Configuration configuration) |
|||
{ |
|||
int startY = sourceRectangle.Y; |
|||
int endY = sourceRectangle.Bottom; |
|||
int startX = sourceRectangle.X; |
|||
int endX = sourceRectangle.Right; |
|||
|
|||
// Align start/end positions.
|
|||
int minX = Math.Max(0, startX); |
|||
int maxX = Math.Min(source.Width, endX); |
|||
int minY = Math.Max(0, startY); |
|||
int maxY = Math.Min(source.Height, endY); |
|||
|
|||
// Reset offset if necessary.
|
|||
if (minX > 0) |
|||
{ |
|||
startX = 0; |
|||
} |
|||
|
|||
if (minY > 0) |
|||
{ |
|||
startY = 0; |
|||
} |
|||
|
|||
var alphaVector = new Vector4(1, 1, 1, this.Value); |
|||
|
|||
Parallel.For( |
|||
minY, |
|||
maxY, |
|||
configuration.ParallelOptions, |
|||
y => |
|||
{ |
|||
Span<TPixel> row = source.GetPixelRowSpan(y - startY); |
|||
|
|||
for (int x = minX; x < maxX; x++) |
|||
{ |
|||
ref TPixel pixel = ref row[x - startX]; |
|||
pixel.PackFromVector4(pixel.ToVector4() * alphaVector); |
|||
} |
|||
}); |
|||
} |
|||
} |
|||
} |
|||
@ -1,87 +0,0 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using System; |
|||
using System.Numerics; |
|||
using System.Threading.Tasks; |
|||
using SixLabors.ImageSharp.Advanced; |
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
using SixLabors.Primitives; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// An <see cref="IImageProcessor{TPixel}"/> to change the brightness of an <see cref="Image{TPixel}"/>.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class BrightnessProcessor<TPixel> : ImageProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="BrightnessProcessor{TPixel}"/> class.
|
|||
/// </summary>
|
|||
/// <param name="brightness">The new brightness of the image. Must be between -100 and 100.</param>
|
|||
/// <exception cref="System.ArgumentException">
|
|||
/// <paramref name="brightness"/> is less than -100 or is greater than 100.
|
|||
/// </exception>
|
|||
public BrightnessProcessor(int brightness) |
|||
{ |
|||
Guard.MustBeBetweenOrEqualTo(brightness, -100, 100, nameof(brightness)); |
|||
this.Value = brightness; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the brightness value.
|
|||
/// </summary>
|
|||
public int Value { get; } |
|||
|
|||
/// <inheritdoc/>
|
|||
protected override void OnApply(ImageFrame<TPixel> source, Rectangle sourceRectangle, Configuration configuration) |
|||
{ |
|||
float brightness = this.Value / 100F; |
|||
|
|||
int startY = sourceRectangle.Y; |
|||
int endY = sourceRectangle.Bottom; |
|||
int startX = sourceRectangle.X; |
|||
int endX = sourceRectangle.Right; |
|||
|
|||
// Align start/end positions.
|
|||
int minX = Math.Max(0, startX); |
|||
int maxX = Math.Min(source.Width, endX); |
|||
int minY = Math.Max(0, startY); |
|||
int maxY = Math.Min(source.Height, endY); |
|||
|
|||
// Reset offset if necessary.
|
|||
if (minX > 0) |
|||
{ |
|||
startX = 0; |
|||
} |
|||
|
|||
if (minY > 0) |
|||
{ |
|||
startY = 0; |
|||
} |
|||
|
|||
Parallel.For( |
|||
minY, |
|||
maxY, |
|||
configuration.ParallelOptions, |
|||
y => |
|||
{ |
|||
Span<TPixel> row = source.GetPixelRowSpan(y - startY); |
|||
|
|||
for (int x = minX; x < maxX; x++) |
|||
{ |
|||
ref TPixel pixel = ref row[x - startX]; |
|||
|
|||
// TODO: Check this with other formats.
|
|||
Vector4 vector = pixel.ToVector4().Expand(); |
|||
Vector3 transformed = new Vector3(vector.X, vector.Y, vector.Z) + new Vector3(brightness); |
|||
vector = new Vector4(transformed, vector.W); |
|||
|
|||
pixel.PackFromVector4(vector.Compress()); |
|||
} |
|||
}); |
|||
} |
|||
} |
|||
} |
|||
@ -1,89 +0,0 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using System; |
|||
using System.Numerics; |
|||
using System.Threading.Tasks; |
|||
using SixLabors.ImageSharp.Advanced; |
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
using SixLabors.Primitives; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// An <see cref="IImageProcessor{TPixel}"/> to change the contrast of an <see cref="Image{TPixel}"/>.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class ContrastProcessor<TPixel> : ImageProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="ContrastProcessor{TPixel}"/> class.
|
|||
/// </summary>
|
|||
/// <param name="contrast">The new contrast of the image. Must be between -100 and 100.</param>
|
|||
/// <exception cref="System.ArgumentException">
|
|||
/// <paramref name="contrast"/> is less than -100 or is greater than 100.
|
|||
/// </exception>
|
|||
public ContrastProcessor(int contrast) |
|||
{ |
|||
Guard.MustBeBetweenOrEqualTo(contrast, -100, 100, nameof(contrast)); |
|||
this.Value = contrast; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the contrast value.
|
|||
/// </summary>
|
|||
public int Value { get; } |
|||
|
|||
/// <inheritdoc/>
|
|||
protected override void OnApply(ImageFrame<TPixel> source, Rectangle sourceRectangle, Configuration configuration) |
|||
{ |
|||
float contrast = (100F + this.Value) / 100F; |
|||
|
|||
int startY = sourceRectangle.Y; |
|||
int endY = sourceRectangle.Bottom; |
|||
int startX = sourceRectangle.X; |
|||
int endX = sourceRectangle.Right; |
|||
var contrastVector = new Vector4(contrast, contrast, contrast, 1); |
|||
var shiftVector = new Vector4(.5F, .5F, .5F, 1); |
|||
|
|||
// Align start/end positions.
|
|||
int minX = Math.Max(0, startX); |
|||
int maxX = Math.Min(source.Width, endX); |
|||
int minY = Math.Max(0, startY); |
|||
int maxY = Math.Min(source.Height, endY); |
|||
|
|||
// Reset offset if necessary.
|
|||
if (minX > 0) |
|||
{ |
|||
startX = 0; |
|||
} |
|||
|
|||
if (minY > 0) |
|||
{ |
|||
startY = 0; |
|||
} |
|||
|
|||
Parallel.For( |
|||
minY, |
|||
maxY, |
|||
configuration.ParallelOptions, |
|||
y => |
|||
{ |
|||
Span<TPixel> row = source.GetPixelRowSpan(y - startY); |
|||
|
|||
for (int x = minX; x < maxX; x++) |
|||
{ |
|||
ref TPixel pixel = ref row[x - startX]; |
|||
|
|||
Vector4 vector = pixel.ToVector4().Expand(); |
|||
vector -= shiftVector; |
|||
vector *= contrastVector; |
|||
vector += shiftVector; |
|||
|
|||
pixel.PackFromVector4(vector.Compress()); |
|||
} |
|||
}); |
|||
} |
|||
} |
|||
} |
|||
@ -1,66 +0,0 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using System; |
|||
using System.Numerics; |
|||
using System.Threading.Tasks; |
|||
using SixLabors.ImageSharp.Advanced; |
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
using SixLabors.Primitives; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// An <see cref="IImageProcessor{TPixel}"/> to invert the colors of an <see cref="Image{TPixel}"/>.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class InvertProcessor<TPixel> : ImageProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <inheritdoc/>
|
|||
protected override void OnApply(ImageFrame<TPixel> source, Rectangle sourceRectangle, Configuration configuration) |
|||
{ |
|||
int startY = sourceRectangle.Y; |
|||
int endY = sourceRectangle.Bottom; |
|||
int startX = sourceRectangle.X; |
|||
int endX = sourceRectangle.Right; |
|||
Vector3 inverseVector = Vector3.One; |
|||
|
|||
// Align start/end positions.
|
|||
int minX = Math.Max(0, startX); |
|||
int maxX = Math.Min(source.Width, endX); |
|||
int minY = Math.Max(0, startY); |
|||
int maxY = Math.Min(source.Height, endY); |
|||
|
|||
// Reset offset if necessary.
|
|||
if (minX > 0) |
|||
{ |
|||
startX = 0; |
|||
} |
|||
|
|||
if (minY > 0) |
|||
{ |
|||
startY = 0; |
|||
} |
|||
|
|||
Parallel.For( |
|||
minY, |
|||
maxY, |
|||
configuration.ParallelOptions, |
|||
y => |
|||
{ |
|||
Span<TPixel> row = source.GetPixelRowSpan(y - startY); |
|||
|
|||
for (int x = minX; x < maxX; x++) |
|||
{ |
|||
ref TPixel pixel = ref row[x - startX]; |
|||
|
|||
var vector = pixel.ToVector4(); |
|||
Vector3 vector3 = inverseVector - new Vector3(vector.X, vector.Y, vector.Z); |
|||
|
|||
pixel.PackFromVector4(new Vector4(vector3, vector.W)); |
|||
} |
|||
}); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,23 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Applies a black and white filter matrix to the image
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class BlackWhiteProcessor<TPixel> : FilterProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="BlackWhiteProcessor{TPixel}"/> class.
|
|||
/// </summary>
|
|||
public BlackWhiteProcessor() |
|||
: base(MatrixFilters.BlackWhiteFilter) |
|||
{ |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,34 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Applies a brightness filter matrix using the given amount.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class BrightnessProcessor<TPixel> : FilterProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="BrightnessProcessor{TPixel}"/> class.
|
|||
/// </summary>
|
|||
/// <remarks>
|
|||
/// A value of 0 will create an image that is completely black. A value of 1 leaves the input unchanged.
|
|||
/// Other values are linear multipliers on the effect. Values of an amount over 1 are allowed, providing brighter results.
|
|||
/// </remarks>
|
|||
/// <param name="amount">The proportion of the conversion. Must be greater than or equal to 0.</param>
|
|||
public BrightnessProcessor(float amount) |
|||
: base(MatrixFilters.CreateBrightnessFilter(amount)) |
|||
{ |
|||
this.Amount = amount; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the proportion of the conversion
|
|||
/// </summary>
|
|||
public float Amount { get; } |
|||
} |
|||
} |
|||
@ -0,0 +1,23 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Converts the colors of the image recreating Achromatomaly (Color desensitivity) color blindness.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class AchromatomalyProcessor<TPixel> : FilterProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="AchromatomalyProcessor{TPixel}"/> class.
|
|||
/// </summary>
|
|||
public AchromatomalyProcessor() |
|||
: base(MatrixFilters.AchromatomalyFilter) |
|||
{ |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,23 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Converts the colors of the image recreating Achromatopsia (Monochrome) color blindness.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class AchromatopsiaProcessor<TPixel> : FilterProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="AchromatopsiaProcessor{TPixel}"/> class.
|
|||
/// </summary>
|
|||
public AchromatopsiaProcessor() |
|||
: base(MatrixFilters.AchromatopsiaFilter) |
|||
{ |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,23 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Converts the colors of the image recreating Protanomaly (Red-Weak) color blindness.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class ProtanomalyProcessor<TPixel> : FilterProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="ProtanomalyProcessor{TPixel}"/> class.
|
|||
/// </summary>
|
|||
public ProtanomalyProcessor() |
|||
: base(MatrixFilters.ProtanomalyFilter) |
|||
{ |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,34 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Applies a contrast filter matrix using the given amount.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class ContrastProcessor<TPixel> : FilterProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="ContrastProcessor{TPixel}"/> class.
|
|||
/// </summary>
|
|||
/// <remarks>
|
|||
/// A value of 0 will create an image that is completely gray. A value of 1 leaves the input unchanged.
|
|||
/// Other values are linear multipliers on the effect. Values of an amount over 1 are allowed, providing results with more contrast.
|
|||
/// </remarks>
|
|||
/// <param name="amount">The proportion of the conversion. Must be greater than or equal to 0.</param>
|
|||
public ContrastProcessor(float amount) |
|||
: base(MatrixFilters.CreateContrastFilter(amount)) |
|||
{ |
|||
this.Amount = amount; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the proportion of the conversion
|
|||
/// </summary>
|
|||
public float Amount { get; } |
|||
} |
|||
} |
|||
@ -0,0 +1,62 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using System; |
|||
using System.Numerics; |
|||
using System.Threading.Tasks; |
|||
using SixLabors.ImageSharp.Advanced; |
|||
using SixLabors.ImageSharp.Helpers; |
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
using SixLabors.Primitives; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Provides methods that accept a <see cref="Matrix4x4"/> matrix to apply freeform filters to images.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class FilterProcessor<TPixel> : ImageProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="FilterProcessor{TPixel}"/> class.
|
|||
/// </summary>
|
|||
/// <param name="matrix">The matrix used to apply the image filter</param>
|
|||
public FilterProcessor(Matrix4x4 matrix) |
|||
{ |
|||
this.Matrix = matrix; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the <see cref="Matrix4x4"/> used to apply the image filter.
|
|||
/// </summary>
|
|||
public Matrix4x4 Matrix { get; } |
|||
|
|||
/// <inheritdoc/>
|
|||
protected override void OnApply(ImageFrame<TPixel> source, Rectangle sourceRectangle, Configuration configuration) |
|||
{ |
|||
var interest = Rectangle.Intersect(sourceRectangle, source.Bounds()); |
|||
int startY = interest.Y; |
|||
int endY = interest.Bottom; |
|||
int startX = interest.X; |
|||
int endX = interest.Right; |
|||
Matrix4x4 matrix = this.Matrix; |
|||
|
|||
Parallel.For( |
|||
startY, |
|||
endY, |
|||
configuration.ParallelOptions, |
|||
y => |
|||
{ |
|||
Span<TPixel> row = source.GetPixelRowSpan(y); |
|||
|
|||
for (int x = startX; x < endX; x++) |
|||
{ |
|||
ref TPixel pixel = ref row[x]; |
|||
var vector = Vector4.Transform(pixel.ToVector4(), matrix); |
|||
pixel.PackFromVector4(vector); |
|||
} |
|||
}); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,30 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Applies a greyscale filter matrix using the given amount and the formula as specified by ITU-R Recommendation BT.601
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class GrayscaleBt601Processor<TPixel> : FilterProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="GrayscaleBt601Processor{TPixel}"/> class.
|
|||
/// </summary>
|
|||
/// <param name="amount">The proportion of the conversion. Must be between 0 and 1.</param>
|
|||
public GrayscaleBt601Processor(float amount) |
|||
: base(MatrixFilters.CreateGrayscaleBt601Filter(amount)) |
|||
{ |
|||
this.Amount = amount; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the proportion of the conversion
|
|||
/// </summary>
|
|||
public float Amount { get; } |
|||
} |
|||
} |
|||
@ -0,0 +1,30 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Applies a greyscale filter matrix using the given amount and the formula as specified by ITU-R Recommendation BT.709
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class GrayscaleBt709Processor<TPixel> : FilterProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="GrayscaleBt709Processor{TPixel}"/> class.
|
|||
/// </summary>
|
|||
/// <param name="amount">The proportion of the conversion. Must be between 0 and 1.</param>
|
|||
public GrayscaleBt709Processor(float amount) |
|||
: base(MatrixFilters.CreateGrayscaleBt709Filter(amount)) |
|||
{ |
|||
this.Amount = amount; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the proportion of the conversion
|
|||
/// </summary>
|
|||
public float Amount { get; } |
|||
} |
|||
} |
|||
@ -0,0 +1,29 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Applies a hue filter matrix using the given angle of rotation in degrees
|
|||
/// </summary>
|
|||
internal class HueProcessor<TPixel> : FilterProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="HueProcessor{TPixel}"/> class.
|
|||
/// </summary>
|
|||
/// <param name="degrees">The angle of rotation in degrees</param>
|
|||
public HueProcessor(float degrees) |
|||
: base(MatrixFilters.CreateHueFilter(degrees)) |
|||
{ |
|||
this.Degrees = degrees; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the angle of rotation in degrees
|
|||
/// </summary>
|
|||
public float Degrees { get; } |
|||
} |
|||
} |
|||
@ -0,0 +1,30 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Applies a filter matrix that inverts the colors of an image
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class InvertProcessor<TPixel> : FilterProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="InvertProcessor{TPixel}"/> class.
|
|||
/// </summary>
|
|||
/// <param name="amount">The proportion of the conversion. Must be between 0 and 1.</param>
|
|||
public InvertProcessor(float amount) |
|||
: base(MatrixFilters.CreateInvertFilter(amount)) |
|||
{ |
|||
this.Amount = amount; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the proportion of the conversion
|
|||
/// </summary>
|
|||
public float Amount { get; } |
|||
} |
|||
} |
|||
@ -0,0 +1,23 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Applies a filter matrix recreating an old Kodachrome camera effect matrix to the image
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class KodachromeProcessor<TPixel> : FilterProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="KodachromeProcessor{TPixel}"/> class.
|
|||
/// </summary>
|
|||
public KodachromeProcessor() |
|||
: base(MatrixFilters.KodachromeFilter) |
|||
{ |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,30 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Applies an opacity filter matrix using the given amount.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class OpacityProcessor<TPixel> : FilterProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="OpacityProcessor{TPixel}"/> class.
|
|||
/// </summary>
|
|||
/// <param name="amount">The proportion of the conversion. Must be between 0 and 1.</param>
|
|||
public OpacityProcessor(float amount) |
|||
: base(MatrixFilters.CreateOpacityFilter(amount)) |
|||
{ |
|||
this.Amount = amount; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the proportion of the conversion
|
|||
/// </summary>
|
|||
public float Amount { get; } |
|||
} |
|||
} |
|||
@ -0,0 +1,34 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Applies a saturation filter matrix using the given amount.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class SaturateProcessor<TPixel> : FilterProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="SaturateProcessor{TPixel}"/> class.
|
|||
/// </summary>
|
|||
/// <remarks>
|
|||
/// A value of 0 is completely un-saturated. A value of 1 leaves the input unchanged.
|
|||
/// Other values are linear multipliers on the effect. Values of amount over 1 are allowed, providing super-saturated results
|
|||
/// </remarks>
|
|||
/// <param name="amount">The proportion of the conversion. Must be greater than or equal to 0.</param>
|
|||
public SaturateProcessor(float amount) |
|||
: base(MatrixFilters.CreateSaturateFilter(amount)) |
|||
{ |
|||
this.Amount = amount; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the proportion of the conversion
|
|||
/// </summary>
|
|||
public float Amount { get; } |
|||
} |
|||
} |
|||
@ -0,0 +1,30 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
|
|||
namespace SixLabors.ImageSharp.Processing.Processors |
|||
{ |
|||
/// <summary>
|
|||
/// Applies a sepia filter matrix using the given amount.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|||
internal class SepiaProcessor<TPixel> : FilterProcessor<TPixel> |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
/// <summary>
|
|||
/// Initializes a new instance of the <see cref="SepiaProcessor{TPixel}"/> class.
|
|||
/// </summary>
|
|||
/// <param name="amount">The proportion of the conversion. Must be between 0 and 1.</param>
|
|||
public SepiaProcessor(float amount) |
|||
: base(MatrixFilters.CreateSepiaFilter(amount)) |
|||
{ |
|||
this.Amount = amount; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the proportion of the conversion
|
|||
/// </summary>
|
|||
public float Amount { get; } |
|||
} |
|||
} |
|||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue