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