Skip to content

Commit aa97ff6

Browse files
committed
fix framebuffer raize ValueError when read size not match
1 parent fe3aa9c commit aa97ff6

4 files changed

Lines changed: 17 additions & 6 deletions

File tree

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,11 @@ d.get_state() # same as adb get-state
200200

201201
Take screenshot
202202

203-
```bash
203+
```python
204+
# Method 1 (Recommend)
205+
pil_image = d.screenshot()
206+
207+
# Method 2
204208
# adb exec-out screencap -p p.png
205209
png_data = d.shell("screencap -p", encoding=None)
206210
pathlib.Path("p.png").write_bytes(png_data)

adbutils/_device.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import typing
1414
from typing import Optional, Union
1515

16-
from PIL import Image
16+
from PIL import Image, UnidentifiedImageError
1717

1818
from adbutils._deprecated import DeprecatedExtension
1919
from adbutils.install import InstallExtension
@@ -337,6 +337,8 @@ def framebuffer(self) -> Image.Image:
337337
if color_format != 'RGBA' and color_format != 'RGB':
338338
raise NotImplementedError("Unsupported color format")
339339
buffer = c.read(size)
340+
if len(buffer) != size:
341+
raise UnidentifiedImageError("framebuffer size not match", size, len(buffer))
340342
image = Image.frombytes(color_format, (width, height), buffer)
341343
return image
342344

adbutils/screenshot.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import abc
88
import io
9+
import logging
910
from typing import Optional, Union
1011
from adbutils.sync import Sync
1112
from adbutils._proto import WindowSize
@@ -17,6 +18,7 @@
1718
# fix for py37
1819
UnidentifiedImageError = OSError
1920

21+
logger = logging.getLogger(__name__)
2022

2123
class AbstractDevice(abc.ABC):
2224
@property
@@ -42,6 +44,7 @@ def __init__(self):
4244

4345
def screenshot(self) -> Image.Image:
4446
""" Take a screenshot and return PIL.Image.Image object
47+
If capture failed, return a black image
4548
"""
4649
try:
4750
pil_image = self.__screencap()
@@ -50,13 +53,15 @@ def screenshot(self) -> Image.Image:
5053
return pil_image
5154
except UnidentifiedImageError as e:
5255
wsize = self.window_size()
53-
return Image.new("RGB", wsize, (220, 120, 100))
56+
return Image.new("RGB", wsize, (0, 0, 0))
5457

5558
def __screencap(self) -> Image.Image:
5659
if self.__framebuffer_ok:
5760
try:
5861
return self.framebuffer()
5962
except NotImplementedError:
6063
self.__framebuffer_ok = False
61-
png_bytes = self.shell('screencap', encoding=None)
64+
except UnidentifiedImageError as e:
65+
logger.warning("framebuffer error: %s", e)
66+
png_bytes = self.shell('screencap -p', encoding=None)
6267
return Image.open(io.BytesIO(png_bytes))

setup.cfg

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ classifier =
1515
Intended Audience :: Developers
1616
Operating System :: POSIX
1717
Programming Language :: Python :: 3
18-
Programming Language :: Python :: 3.6
19-
Programming Language :: Python :: 3.7
2018
Programming Language :: Python :: 3.8
19+
Programming Language :: Python :: 3.9
20+
Programming Language :: Python :: 3.10
2121
Topic :: Software Development :: Libraries :: Python Modules
2222
Topic :: Software Development :: Testing
2323

0 commit comments

Comments
 (0)