nopWatermark

nopWatermark
4.3 10
This plugin dynamically adds watermarks (text or picture) to the store pictures (Products, Categories, Manufacturers) without changing the original images. This plugin also supports a multi-store configuration.
2025-04-16T21:27:06.3119756Z
Free
Get extension (2181 Downloads)
Supported versions: 4.20, 4.30, 4.40, 4.50, 4.60
Created: November 18,2017
Last updated: February 05,2023
Description

Current version 1.0.9

Feature additions:

  • added azure blob storage support.

This plugin is free and open source. See full documentation with examples on https://github.com/MarinaAndreeva/nopWatermark

This plugin dynamically adds watermarks (text or picture) to the store pictures (Products, Categories, Manufacturers) without changing the original images. The plugin will help you save your store pictures from being stolen.
Please note: this plugin doesn't apply watermarks to SVG images.

The plugin for earlier versions of nopCommerce can be downloaded from GitHub

The plugin is available in 3 languages: English, Ukrainian, Russian .
You can add custom localization files to the "Resources" folder. The file name should look like this: "Locale.seoCode.xml", where seoCode is two letter unique language code (List of codes).

Configuration page:

Text: this section contains a configuration for a text watermark.

Text watermark section

Options:

  • Enable text watermark – check this box to enable text watermark.
  • Text – this text will be displayed in the store pictures.
  • You can also select: text font, text color, watermark size in % relative to the original image, position of the watermark text, opacity (0 – transparent text, 1 – opaque text) and watermark text rotation angle.

There is the possibility of using custom fonts for text watermark. This can be achieved by placing the TTF font file in the Fonts folder. After installing/reloading the plugin, the added font will appear in the Text font plugin setting.

Picture: this section contains a configuration a picture watermark.

Picture watermark section

Options:

  • Enable picture watermark – check this box to enable picture watermark.
  • Picture – upload a watermark picture file.
  • You can also select: watermark size in % relative to the original image, position of the watermark text, opacity (0 – transparent text, 1 – opaque text).

Common settings: this section contains common configuration for a text/picture watermark.

Common settings section

Options:

  • Tick the check boxes to select the sections to place the watermark: Products, Categories, Manufacturers.
  • Enter the minimum image width/height to place the watermark. Watermarks will only be displayed on images that are larger/higher than the specified width/height. If width/height = 0, the watermark will be applied for all image sizes.
Reviews
uciocan 10/11/2023 3:55 AM
4.60.4 not working
The plugin seems to me that doesn't work with 4.60.4 version. The log writes:
Log level
Error
Short message
Value cannot be null. (Parameter 'codec')
Full message
System.ArgumentNullException: Value cannot be null. (Parameter 'codec')
   at SkiaSharp.SKBitmap.Decode(SKCodec codec)
   at SkiaSharp.SKBitmap.Decode(ReadOnlySpan`1 buffer)
   at SkiaSharp.SKBitmap.Decode(Byte[] buffer)
   at Nop.Plugin.Misc.Watermark.Services.MiscWatermarkPictureService.GetPictureUrlAsync(Picture picture, Int32 targetSize, Boolean showDefaultPicture, String storeLocation, PictureType defaultPictureType)
   at Nop.Services.Media.PictureService.GetPictureUrlAsync(Int32 pictureId, Int32 targetSize, Boolean showDefaultPicture, String storeLocation, PictureType defaultPictureType) in D:\Sviluppo\Hobbystore4604\Libraries\Nop.Services\Media\PictureService.cs:line 551
   at SevenSpikes.Nop.Plugins.MegaMenu.Components.MegaMenuCategoryViewComponent.PreparePictureModelAsync(Int32 pictureId, Int32 pictureSize, String name)
   at SevenSpikes.Nop.Plugins.MegaMenu.Components.MegaMenuCategoryViewComponent.BuildCategoryModelRecursiveAsync(MenuItemModel menuItem, Category category, IList`1 allCategories, Int32 level)
   at SevenSpikes.Nop.Plugins.MegaMenu.Components.MegaMenuCategoryViewComponent.BuildCategoryModelRecursiveAsync(MenuItemModel menuItem, Category category, IList`1 allCategories, Int32 level)
   at SevenSpikes.Nop.Plugins.MegaMenu.Components.MegaMenuCategoryViewComponent.PrepareCategoriesModelAsync(MenuItemModel menuItem, Boolean isResponsive)
   at SevenSpikes.Nop.Plugins.MegaMenu.Components.MegaMenuCategoryViewComponent.<>c__DisplayClass13_0.<<InvokeAsync>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Nop.Core.Caching.MemoryCacheManager.GetAsync[T](CacheKey key, Func`1 acquire)
   at SevenSpikes.Nop.Plugins.MegaMenu.Components.MegaMenuCategoryViewComponent.InvokeAsync(MenuItemModel menuItem, Boolean isResponsive)
   at Microsoft.AspNetCore.Mvc.ViewComponents.DefaultViewComponentInvoker.InvokeAsyncCore(ObjectMethodExecutor executor, Object component, ViewComponentContext context)
   at Microsoft.AspNetCore.Mvc.ViewComponents.DefaultViewComponentInvoker.InvokeAsync(ViewComponentContext context)
   at Microsoft.AspNetCore.Mvc.ViewComponents.DefaultViewComponentInvoker.InvokeAsync(ViewComponentContext context)
   at Microsoft.AspNetCore.Mvc.ViewComponents.DefaultViewComponentHelper.InvokeCoreAsync(ViewComponentDescriptor descriptor, Object arguments)
   at AspNetCore.Plugins_SevenSpikes_Nop_Plugins_MegaMenu_Themes_Minimal_Views_Components_MegaMenu_MegaMenu.ExecuteAsync() in E:\website\SparesGarden4604\Plugins\SevenSpikes.Nop.Plugins.MegaMenu\Themes\Minimal\Views\Components\MegaMenu\MegaMenu.cshtml:line 44
   at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageCoreAsync(IRazorPage page, ViewContext context)
   at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageAsync(IRazorPage page, ViewContext context, Boolean invokeViewStarts)
   at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderAsync(ViewContext context)
   at Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult.ExecuteAsync(ViewComponentContext context)
   at Microsoft.AspNetCore.Mvc.ViewComponents.DefaultViewComponentInvoker.InvokeAsync(ViewComponentContext context)
   at Microsoft.AspNetCore.Mvc.ViewComponents.DefaultViewComponentHelper.InvokeCoreAsync(ViewComponentDescriptor descriptor, Object arguments)
   at AspNetCore.Views_Shared_Components_Widget_Default.ExecuteAsync() in E:\website\SparesGarden4604\Views\Shared\Components\Widget\Default.cshtml:line 4
   at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageCoreAsync(IRazorPage page, ViewContext context)
   at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageAsync(IRazorPage page, ViewContext context, Boolean invokeViewStarts)
   at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderAsync(ViewContext context)
   at Microsoft.AspNetCore.Mvc.ViewComponents.ViewViewComponentResult.ExecuteAsync(ViewComponentContext context)
   at Microsoft.AspNetCore.Mvc.ViewComponents.DefaultViewComponentInvoker.InvokeAsync(ViewComponentContext context)
   at Microsoft.AspNetCore.Mvc.ViewComponents.DefaultViewComponentHelper.InvokeCoreAsync(ViewComponentDescriptor descriptor, Object arguments)
   at AspNetCore.Themes_Minimal_Views_Shared__Header.ExecuteAsync() in E:\website\SparesGarden4604\Themes\Minimal\Views\Shared\_Header.cshtml:line 17
   at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageCoreAsync(IRazorPage page, ViewContext context)
   at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageAsync(IRazorPage page, ViewContext context, Boolean invokeViewStarts)
   at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderAsync(ViewContext context)
   at Microsoft.AspNetCore.Mvc.ViewFeatures.HtmlHelper.RenderPartialCoreAsync(String partialViewName, Object model, ViewDataDictionary viewData, TextWriter writer)
   at AspNetCore.Themes_Minimal_Views_Shared__Root.ExecuteAsync() in E:\website\SparesGarden4604\Themes\Minimal\Views\Shared\_Root.cshtml:line 38
   at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageCoreAsync(IRazorPage page, ViewContext context)
   at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageAsync(IRazorPage page, ViewContext context, Boolean invokeViewStarts)
   at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderLayoutAsync(ViewContext context, ViewBufferTextWriter bodyWriter)
   at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderAsync(ViewContext context)
   at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ViewContext viewContext, String contentType, Nullable`1 statusCode)
   at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ViewContext viewContext, String contentType, Nullable`1 statusCode)
   at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ActionContext actionContext, IView view, ViewDataDictionary viewData, ITempDataDictionary tempData, String contentType, Nullable`1 statusCode)
   at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewResultExecutor.ExecuteAsync(ActionContext context, ViewResult result)
   at Microsoft.AspNetCore.Mvc.ViewResult.ExecuteResultAsync(ActionContext context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResultFilterAsync>g__Awaited|30_0[TFilter,TFilterAsync](ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeResultFilters>g__Awaited|28_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Nop.Services.Authentication.AuthenticationMiddleware.InvokeAsync(HttpContext context) in D:\Sviluppo\Hobbystore4604\Libraries\Nop.Services\Authentication\AuthenticationMiddleware.cs:line 94
   at StackExchange.Profiling.MiniProfilerMiddleware.Invoke(HttpContext context) in C:\projects\dotnet\src\MiniProfiler.AspNetCore\MiniProfilerMiddleware.cs:line 103
   at WebMarkupMin.AspNetCore7.WebMarkupMinMiddleware.InvokeCore(HttpContext context, Boolean useMinification, Boolean useCompression)
   at WebMarkupMin.AspNetCore7.WebMarkupMinMiddleware.InvokeCore(HttpContext context, Boolean useMinification, Boolean useCompression)
   at Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
   at Nop.Services.Installation.InstallUrlMiddleware.InvokeAsync(HttpContext context, IWebHelper webHelper) in D:\Sviluppo\Hobbystore4604\Libraries\Nop.Services\Installation\InstallUrlMiddleware.cs:line 52
   at Nop.Services.Common.KeepAliveMiddleware.InvokeAsync(HttpContext context, IWebHelper webHelper) in D:\Sviluppo\Hobbystore4604\Libraries\Nop.Services\Common\KeepAliveMiddleware.cs:line 49
   at Microsoft.AspNetCore.ResponseCompression.ResponseCompressionMiddleware.InvokeCore(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.StatusCodePagesMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.StatusCodePagesMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddlewareImpl.<Invoke>g__Awaited|8_0(ExceptionHandlerMiddlewareImpl middleware, HttpContext context, Task task)
Was this review helpful? Yes0 / No0
monowar.mbstu 10/11/2020 4:29 PM
Plugin is not working properly
The text or watermark is only shown at quick view but not in details view for my theme.
After uninstalling the plugin some of the product quick view image already contains the watermark.
What is the issue? I am using nopcommerce 4.3
Was this review helpful? Yes0 / No1
A manager responded to this review
Please, try to clear your browser cache. Or reload the page using Ctrl+F5
itinnovations 9/19/2020 8:41 PM
Hidden Google Ads Code
This is a great plugin. The fact that is free is even better. However, if you are going to put google ads code in the source at least let your potential users know its there. Let them decide to install or not. Below are the resources that will load if you use this plugin. Not trying to say the developer should not make money, just be transparent about it.

hxxps://googleads.g.doubleclick.net/pagead/id
hxxps://static.doubleclick.net/instream/ad_status.js
Was this review helpful? Yes2 / No1
A manager responded to this review
This plugin doesn't load any additional resources on any page. NopWatermark is an open source plugin - you can go to https://github.com/MarinaAndreeva/nopWatermark and check everything by yourself.

Maybe you confused this plugin with some other one (the one from FoxNetSoft)?
sofland 5/6/2020 11:44 AM
Great one
Very helpful
I would suggest:
since nop is not showing the name of the color in Product attribute, it would be great if you can add the name to the picture,
so if some one click the picture, he will know what is the name of that color.
and you can position the name and color it as your watermark, you can make money in this case, because all who use color attribute would prefer to see the name on the picture when they are viewing the pictures
Was this review helpful? Yes0 / No0
cdpack 4/25/2020 12:04 PM
language code (List of codes).
If I choose the US when installing the plugin, zm?
Was this review helpful? Yes0 / No0
RimedSerkan 2/27/2020 8:31 AM
Install problem
Hi, I am trying to install but I can not.
nopcommerce version 4.20
Was this review helpful? Yes0 / No0
A manager responded to this review
Thank you for your response. I sent you a private message to help with the plugin.
xDMK 12/9/2018 4:52 PM
When release nopwatermark 1.07?
When release nopwatermark 1.07?
Was this review helpful? Yes0 / No0
A manager responded to this review
New version has been just released.
You can download the latest version from github or marketplace.
mkill22 9/7/2018 1:40 PM
Works well
Great plugin - works really well, thank you. Only issue I have is that it doesn't watermark product images displayed on the homepage.
Was this review helpful? Yes0 / No0
A manager responded to this review
Could you describe your issue in detail? How big are the thumbnails on the Homepage?
utneflyte 8/17/2018 10:47 PM
Great Plugin
Great plugin that does the job as described.  No issues here and big bonus for access to source code.

Hoping developer release update for nop 4.10 and continues further.
Was this review helpful? Yes0 / No0
A manager responded to this review
New version has been just released.
You can download the latest version from github or marketplace.
mjvakili 11/27/2017 3:10 PM
Thanks
Very Thanks.
Best plugin for nopcommerce.
Png images are not supported correctly.
after use this plugin, Png images is background black.
Was this review helpful? Yes1 / No0
A manager responded to this review
Thank you for your response!
This bug is fixed in the latest version (1.0.3).

Please, download the latest version from github or marketplace.