Skip to content

Commit d3900a8

Browse files
RussTorresfcollman
authored andcommitted
client: add ARGBRender functionality and wrapped call (#121)
1 parent 27db186 commit d3900a8

File tree

3 files changed

+100
-4
lines changed

3 files changed

+100
-4
lines changed

integration_tests/test_client_integrated.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import logging
66
import sys
77
import json
8+
from PIL import Image
89
import numpy as np
910
from test_data import (render_host, render_port,
1011
client_script_location, tilespec_file, tform_file,
@@ -358,3 +359,37 @@ def test_processpools_parallelfuncs(
358359
render, render_example_tilespec_and_transforms,
359360
"{}_jsonfiles".format(stackbase), False, poolsize=poolsize,
360361
mpPool=poolclass)
362+
363+
364+
@pytest.fixture(scope='module')
365+
def tile_tilespec():
366+
tile_dims = (256, 256)
367+
with tempfile.NamedTemporaryFile(suffix='.tif', mode='w') as imgf:
368+
arr = np.random.randint(0, 256, size=tile_dims, dtype='uint8')
369+
img = Image.fromarray(arr)
370+
img.save(imgf.name)
371+
372+
ts = renderapi.tilespec.TileSpec(
373+
tileId='myTestTile',
374+
z=1.,
375+
sectionId="z1.0",
376+
width=tile_dims[0],
377+
height=tile_dims[1],
378+
minint=0,
379+
maxint=255,
380+
imageUrl="file://{}".format(imgf.name))
381+
ts.minX = 0
382+
ts.maxX = tile_dims[0]
383+
ts.minY = 0
384+
ts.maxY = tile_dims[1]
385+
386+
yield imgf.name, ts
387+
388+
389+
def test_ARGBrenderclient(render, tile_tilespec):
390+
tile, tspec = tile_tilespec
391+
arr = renderapi.client.render_tilespec(tspec, memGB='512M', render=render)
392+
with Image.open(tile) as tileimg:
393+
tilearr = np.array(tileimg)
394+
assert arr.shape[:-1] == (tspec.width, tspec.height) == tilearr.shape
395+
assert np.all(arr[:, :, 0] == tilearr)

renderapi/client/client.py

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
import os
66
from functools import partial
77
import logging
8+
import tempfile
9+
10+
import numpy
11+
from PIL import Image
812

913
from renderapi.utils import NullHandler, renderdump_temp
1014
from renderapi.render import renderaccess
@@ -13,7 +17,7 @@
1317
from renderapi.external.processpools.stdlib_pool import WithMultiprocessingPool
1418

1519
from .utils import renderclientaccess
16-
from .client_calls import importJsonClient, call_run_ws_client
20+
from .client_calls import importJsonClient, call_run_ws_client, renderClient
1721

1822
# setup logger
1923
logger = logging.getLogger(__name__)
@@ -361,10 +365,43 @@ def world_to_local_array(stack, points, subprocess_mode=None,
361365
raise NotImplementedError('Whoops.')
362366

363367

368+
def _defaultval(v, default=None):
369+
return default if v is None else v
370+
371+
372+
@renderclientaccess
373+
def materialize_tilespec_image(
374+
tilespec, out_fn=None, height=None, width=None,
375+
x=None, y=None, res=32,
376+
subprocess_mode=None,
377+
client_script=None, memGB=None,
378+
render=None, **kwargs):
379+
tspecfile = renderdump_temp([tilespec])
380+
381+
x = _defaultval(x, tilespec.minX)
382+
y = _defaultval(y, tilespec.minY)
383+
width = _defaultval(width, int(float((tilespec.maxX - tilespec.minX))))
384+
height = _defaultval(height, int(float((tilespec.maxY - tilespec.minY))))
385+
renderClient(tile_spec_url=tspecfile, out_fn=out_fn,
386+
height=height, width=width, x=x, y=y, res=res,
387+
subprocess_mode=subprocess_mode,
388+
client_script=client_script, memGB=memGB, **kwargs)
389+
390+
os.remove(tspecfile)
391+
392+
393+
def render_tilespec(*args, **kwargs):
394+
with tempfile.NamedTemporaryFile(suffix='.tif') as f:
395+
materialize_tilespec_image(*args, out_fn=f.name, **kwargs)
396+
arr = numpy.array(Image.open(f.name))
397+
return arr
398+
399+
364400
__all__ = [
365401
"import_single_json_file",
366402
"import_jsonfiles_and_transforms_parallel_by_z",
367403
"import_jsonfiles_parallel", "import_jsonfiles",
368404
"import_jsonfiles_validate_client", "import_tilespecs",
369405
"import_tilespecs_parallel", "local_to_world_array",
370-
"world_to_local_array", "WithPool"]
406+
"world_to_local_array", "WithPool",
407+
"render_tilespec", "materialize_tilespec_image"]

renderapi/client/client_calls.py

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from renderapi.stack import make_stack_params, set_stack_state
1212

1313
from .utils import renderclientaccess
14-
from .params import SiftPointMatchOptions
14+
from .params import ArgumentParameters, SiftPointMatchOptions
1515

1616

1717
# setup logger
@@ -82,7 +82,7 @@ def call_run_ws_client(className, add_args=[], renderclient=None,
8282
logger.warning('call_run_ws_client requires memory specification -- '
8383
'defaulting to 1G')
8484
memGB = '1G'
85-
args = map(str, [client_script, memGB, className] + add_args)
85+
args = list(map(str, [client_script, memGB, className] + add_args))
8686
try:
8787
ret_val = run_subprocess_mode(args, **kwargs)
8888
except subprocess.CalledProcessError:
@@ -658,6 +658,30 @@ def pointMatchClient(stack, collection, tile_pairs,
658658
**kwargs)
659659

660660

661+
@renderclientaccess
662+
def renderClient(tile_spec_url=None, height=None, width=None, in_fn=None,
663+
out_fn=None, x=None, y=None, res=None,
664+
subprocess_mode=None, client_script=None,
665+
memGB=None, render=None, **kwargs):
666+
"""call render
667+
"""
668+
get_cmd_opt = ArgumentParameters.get_cmd_opt
669+
670+
argvs = (get_cmd_opt(tile_spec_url, '--tile_spec_url') +
671+
get_cmd_opt(height, '--height') +
672+
get_cmd_opt(width, '--width') +
673+
get_cmd_opt(in_fn, '--in') +
674+
get_cmd_opt(out_fn, '--out') +
675+
get_cmd_opt(x, '--x') +
676+
get_cmd_opt(y, '--y') +
677+
get_cmd_opt(res, '--res'))
678+
679+
call_run_ws_client('org.janelia.alignment.Render',
680+
memGB=memGB, client_script=client_script,
681+
subprocess_mode=subprocess_mode, add_args=argvs,
682+
**kwargs)
683+
684+
661685
__all__ = [
662686
"call_run_ws_client", "run_subprocess_mode",
663687
"importJsonClient", "tilePairClient",

0 commit comments

Comments
 (0)