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-19T11:28:35.3943941Z
Kostenlos
Extension abrufen (2181 Downloads)
Unterstützte Versionen: 4.20, 4.30, 4.40, 4.50, 4.60
Erstellt: November 18,2017
Zuletzt aktualisiert: Februar 05,2023
Beschreibung

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.
Bewertungen
uciocan 11.10.2023 03:55
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)
War die Bewertung hilfreich? Ja0 / Nein0
monowar.mbstu 11.10.2020 16:29
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
War die Bewertung hilfreich? Ja0 / Nein1
Ein Manager hat auf diese Produktbewertung geantwortet
Please, try to clear your browser cache. Or reload the page using Ctrl+F5
itinnovations 19.09.2020 20:41
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
War die Bewertung hilfreich? Ja2 / Nein1
Ein Manager hat auf diese Produktbewertung geantwortet
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 06.05.2020 11:44
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
War die Bewertung hilfreich? Ja0 / Nein0
cdpack 25.04.2020 12:04
language code (List of codes).
If I choose the US when installing the plugin, zm?
War die Bewertung hilfreich? Ja0 / Nein0
RimedSerkan 27.02.2020 08:31
Install problem
Hi, I am trying to install but I can not.
nopcommerce version 4.20
War die Bewertung hilfreich? Ja0 / Nein0
Ein Manager hat auf diese Produktbewertung geantwortet
Thank you for your response. I sent you a private message to help with the plugin.
xDMK 09.12.2018 16:52
When release nopwatermark 1.07?
When release nopwatermark 1.07?
War die Bewertung hilfreich? Ja0 / Nein0
Ein Manager hat auf diese Produktbewertung geantwortet
New version has been just released.
You can download the latest version from github or marketplace.
mkill22 07.09.2018 13:40
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.
War die Bewertung hilfreich? Ja0 / Nein0
Ein Manager hat auf diese Produktbewertung geantwortet
Could you describe your issue in detail? How big are the thumbnails on the Homepage?
utneflyte 17.08.2018 22:47
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.
War die Bewertung hilfreich? Ja0 / Nein0
Ein Manager hat auf diese Produktbewertung geantwortet
New version has been just released.
You can download the latest version from github or marketplace.
mjvakili 27.11.2017 15:10
Thanks
Very Thanks.
Best plugin for nopcommerce.
Png images are not supported correctly.
after use this plugin, Png images is background black.
War die Bewertung hilfreich? Ja1 / Nein0
Ein Manager hat auf diese Produktbewertung geantwortet
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.