[Telemetry] Apply transparency workaround everywhere
Applies a workaround for transparent PNGs (namely for Fuchsia) that was
present in the numpy/cv2 codepath to the pure Python codepaths. This
fixes the issue where pixel tests on Fuchsia fail when under Python 3
due to having a black background caused by transparency.
Bug: chromium:1198237
Change-Id: Icc809440369fe0aa34568ce226b6fd6fa9f68bcb
Reviewed-on: https://chromium-review.googlesource.com/c/catapult/+/3283331
Auto-Submit: Brian Sheedy <bsheedy@chromium.org>
Commit-Queue: Wenbin Zhang <wenbinzhang@google.com>
Reviewed-by: Wenbin Zhang <wenbinzhang@google.com>
diff --git a/telemetry/telemetry/internal/image_processing/_bitmap.py b/telemetry/telemetry/internal/image_processing/_bitmap.py
index 62a4ef4..5f9d7d2 100644
--- a/telemetry/telemetry/internal/image_processing/_bitmap.py
+++ b/telemetry/telemetry/internal/image_processing/_bitmap.py
@@ -158,6 +158,15 @@
'Using pure python png decoder, which could be very slow. To speed up, '
'consider installing numpy & cv2 (OpenCV).')
width, height, pixels, meta = png.Reader(bytes=png_data).read_flat()
+ # Some platforms set a transparent background. For consistency, we override
+ # transparency to white.
+ if meta['alpha']:
+ for i in range(3, len(pixels), 4):
+ if pixels[i] == 0:
+ pixels[i] = 255
+ pixels[i - 1] = 255
+ pixels[i - 2] = 255
+ pixels[i - 3] = 255
return Bitmap(4 if meta['alpha'] else 3, width, height, pixels, meta)
@staticmethod
diff --git a/telemetry/telemetry/internal/image_processing/image_util_numpy_impl.py b/telemetry/telemetry/internal/image_processing/image_util_numpy_impl.py
index dc430eb..1f19a47 100644
--- a/telemetry/telemetry/internal/image_processing/image_util_numpy_impl.py
+++ b/telemetry/telemetry/internal/image_processing/image_util_numpy_impl.py
@@ -84,6 +84,14 @@
'Using pure python png decoder, which could be very slow. To speed up, '
'consider installing numpy & cv2 (OpenCV).')
width, height, pixels, meta = png.Reader(bytes=png_data).read_flat()
+ # Same as the cv2 path - override transparent pixels to be white.
+ if meta['alpha']:
+ for i in range(3, len(pixels), 4):
+ if pixels[i] == 0:
+ pixels[i] = 255
+ pixels[i - 1] = 255
+ pixels[i - 2] = 255
+ pixels[i - 3] = 255
return FromRGBPixels(width, height, pixels, 4 if meta['alpha'] else 3)
def _SimpleDiff(image1, image2):