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-02-24T03:11:08.4655706Z
免费
获取扩展 (2169 下载)
支持的版本: 4.20, 4.30, 4.40, 4.50, 4.60
创建于 十一月 18,2017
最后更新: 二月 05,2023
描述

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.
评论
uciocan 2023/10/11 上午3: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)
这个评价是否有帮助? 0 / 0
monowar.mbstu 2020/10/11 下午4: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
这个评价是否有帮助? 0 / 1
管理员回复了此评论
Please, try to clear your browser cache. Or reload the page using Ctrl+F5
itinnovations 2020/9/19 下午8: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
这个评价是否有帮助? 2 / 1
管理员回复了此评论
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 2020/5/6 上午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
这个评价是否有帮助? 0 / 0
cdpack 2020/4/25 下午12:04
language code (List of codes).
If I choose the US when installing the plugin, zm?
这个评价是否有帮助? 0 / 0
RimedSerkan 2020/2/27 上午8:31
Install problem
Hi, I am trying to install but I can not.
nopcommerce version 4.20
这个评价是否有帮助? 0 / 0
管理员回复了此评论
Thank you for your response. I sent you a private message to help with the plugin.
xDMK 2018/12/9 下午4:52
When release nopwatermark 1.07?
When release nopwatermark 1.07?
这个评价是否有帮助? 0 / 0
管理员回复了此评论
New version has been just released.
You can download the latest version from github or marketplace.
mkill22 2018/9/7 下午1: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.
这个评价是否有帮助? 0 / 0
管理员回复了此评论
Could you describe your issue in detail? How big are the thumbnails on the Homepage?
utneflyte 2018/8/17 下午10: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.
这个评价是否有帮助? 0 / 0
管理员回复了此评论
New version has been just released.
You can download the latest version from github or marketplace.
mjvakili 2017/11/27 下午3:10
Thanks
Very Thanks.
Best plugin for nopcommerce.
Png images are not supported correctly.
after use this plugin, Png images is background black.
这个评价是否有帮助? 1 / 0
管理员回复了此评论
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.