Recently, a bug was reported in nopCommerce 3.70 version that is related to image resizing. Today, we will go over the process / step to fix this bug in 3.70 version.
Bug / Issue:
An issue exists in the PictureService which creates a white single pixel strip either vertical or horizontal on resized images such as thumbnails. The white strip appears on the right or bottom of the image.
The issue appears when the original image size does not divide evenly into the destination size and the remainder is > 0.5. For example, when a final floating point width of 47.8 is determined, the remainder is dropped (not rounded) and the image is resized to only 47 pixels instead of 48 leaving a white border on the right side of the image.
Go to: ../Libraries/Nop.Services/Media/PictureService.cs
Open “PictureService.cs” file and look for this:
/// <summary> /// Calculates picture dimensions whilst maintaining aspect /// </summary> /// <param name="originalSize">The original picture size</param> /// <param name="targetSize">The target picture size (longest side)</param> /// <param name="resizeType">Resize type</param> /// <param name="ensureSizePositive">A value indicatingh whether we should ensure that size values are positive</param> /// <returns></returns> protected virtual Size CalculateDimensions(Size originalSize, int targetSize, ResizeType resizeType = ResizeType.LongestSide, bool ensureSizePositive = true)
This is the old code (with bug):
case ResizeType.LongestSide: if (originalSize.Height > originalSize.Width) { // portrait newSize.Width = (int)(originalSize.Width * (float)(targetSize / (float)originalSize.Height)); newSize.Height = targetSize; } else { // landscape or square newSize.Height = (int)(originalSize.Height * (float)(targetSize / (float)originalSize.Width)); newSize.Width = targetSize; } break; case ResizeType.Width: newSize.Height = (int)(originalSize.Height * (float)(targetSize / (float)originalSize.Width)); newSize.Width = targetSize; break; case ResizeType.Height: newSize.Width = (int)(originalSize.Width * (float)(targetSize / (float)originalSize.Height)); newSize.Height = targetSize; break;
Fix: New code (note addition of 4 instances of Math.Round)
case ResizeType.LongestSide: if (originalSize.Height > originalSize.Width) { // portrait newSize.Width = (int)Math.Round(originalSize.Width * (float)(targetSize / (float)originalSize.Height)); newSize.Height = targetSize; } else { // landscape or square newSize.Height = (int)Math.Round(originalSize.Height * (float)(targetSize / (float)originalSize.Width)); newSize.Width = targetSize; } break; case ResizeType.Width: newSize.Height = (int)Math.Round(originalSize.Height * (float)(targetSize / (float)originalSize.Width)); newSize.Width = targetSize; break; case ResizeType.Height: newSize.Width = (int)Math.Round(originalSize.Width * (float)(targetSize / (float)originalSize.Height)); newSize.Height = targetSize; break;
The method should look like this after applying this fix:
protected virtual Size CalculateDimensions(Size originalSize, int targetSize, ResizeType resizeType = ResizeType.LongestSide, bool ensureSizePositive = true) { var newSize = new Size(); switch (resizeType) { case ResizeType.LongestSide: if (originalSize.Height > originalSize.Width) { // portrait newSize.Width = (int)Math.Round(originalSize.Width * (float)(targetSize / (float)originalSize.Height)); newSize.Height = targetSize; } else { // landscape or square newSize.Height = (int)Math.Round(originalSize.Height * (float)(targetSize / (float)originalSize.Width)); newSize.Width = targetSize; } break; case ResizeType.Width: newSize.Height = (int)Math.Round(originalSize.Height * (float)(targetSize / (float)originalSize.Width)); newSize.Width = targetSize; break; case ResizeType.Height: newSize.Width = (int)Math.Round(originalSize.Width * (float)(targetSize / (float)originalSize.Height)); newSize.Height = targetSize; break; default: throw new Exception("Not supported ResizeType"); } if (ensureSizePositive) { if (newSize.Width < 1) newSize.Width = 1; if (newSize.Height < 1) newSize.Height = 1; } return newSize; }
The issue is discussed here: http://www.nopcommerce.com/boards/t/30972/getting-one-white-pixel-along-the-height-on-picture-when-upgrading-to-33.aspx
GitHub work item: https://github.com/nopSolutions/nopCommerce/issues/1031
Looking for quality nopCommerce Web Hosting? Look no further than Arvixe Web Hosting!