RGB Renderer

Screenshot of RGB Renderer App


Demonstrates how to use an RGBRenderer on a RasterLayer. An RGBRenderer is used to adjust the color bands of a multispectral image.


  • ArcGISMap
  • Basemap
  • MapView
  • Raster
  • RasterLayer
  • RGBRenderer
  • StretchParameters

How to Use

Tap on the Edit renderer button in the toolbar to change the settings for the RGBRenderer. The sample allows you to change the stretch type and parameters for each type. You can tap on the Render button to update the raster.

How it Works

To apply a RGBRenderer to a RasterLayer:

  1. Create a Raster from a from a multispectral raster file.
  2. Create a RasterLayer from the Raster.
  3. Create a Basemap from the RasterLayer and set it to the map.
  4. Create a RGBRenderer, specifying the stretch parameters and other properties.
  5. Set the Renderer on the RasterLayer with rasterLayer.setRenderer(renderer).

Provision your device

  1. Download the raster-file.zip data from ArcGIS Online.
  2. Extract the contents of the downloaded zip file to disk.
  3. Create an ArcGIS/samples/raster folder on your device. You can use the Android Debug Bridge (adb) tool found in <sdk-dir>/platform-tools.
  4. Open up a command prompt and execute the adb shell command to start a remote shell on your target device.
  5. Navigate to your sdcard directory, e.g. cd /sdcard/.
  6. Create the ArcGIS/samples directory, mkdir ArcGIS/samples/raster.
  7. You should now have the following directory on your target device, /sdcard/ArcGIS/samples/raster. We will copy the contents of the downloaded data into this directory. Note: Directory may be slightly different on your device.
  8. Exit the shell with the, exit command.
  9. While still in your command prompt, navigate to the root folder where you extracted the contents of the data from step 1 and execute the following command:

adb push raster-file/. /sdcard/ArcGIS/samples/raster

LinkLocal Location




/* Copyright 2017 Esri
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *    http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * See the License for the specific language governing permissions and
 * limitations under the License.

package com.esri.arcgisruntime.sample.rgbrenderer;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentManager;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;
import com.esri.arcgisruntime.layers.RasterLayer;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.Basemap;
import com.esri.arcgisruntime.mapping.view.MapView;
import com.esri.arcgisruntime.raster.MinMaxStretchParameters;
import com.esri.arcgisruntime.raster.PercentClipStretchParameters;
import com.esri.arcgisruntime.raster.RGBRenderer;
import com.esri.arcgisruntime.raster.Raster;
import com.esri.arcgisruntime.raster.StandardDeviationStretchParameters;
import com.esri.arcgisruntime.raster.StretchParameters;

import java.io.File;
import java.util.Arrays;

public class MainActivity extends AppCompatActivity implements ParametersDialogFragment.ParametersListener {

  private FragmentManager mFragmentManager;
  private MapView mMapView;
  private RasterLayer mRasterLayer;

  private int mMinR;
  private int mMaxR;
  private int mMinG;
  private int mMaxG;
  private int mMinB;
  private int mMaxB;
  private int mPercentClipMin;
  private int mPercentClipMax;
  private int mStdDevFactor;
  private StretchType mStretchType;

  public void returnParameters(int minR, int maxR, int minG, int maxG, int minB, int maxB, int percentClipMin,
      int percentClipMax, int stdDevFactor, StretchType stretchType) {
    //gets dialog box parameters and calls updateRenderer
    mMinR = minR;
    mMaxR = maxR;
    mMinG = minG;
    mMaxG = maxG;
    mMinB = minB;
    mMaxB = maxB;
    mPercentClipMin = percentClipMin;
    mPercentClipMax = percentClipMax;
    mStdDevFactor = stdDevFactor;
    mStretchType = stretchType;

  protected void onCreate(Bundle savedInstanceState) {
    //set default values for rgb parameters
    mMinR = 0;
    mMaxR = 255;
    mMinG = 0;
    mMaxG = 255;
    mMinB = 0;
    mMaxB = 255;
    mPercentClipMin = 0;
    mPercentClipMax = 99;
    mStdDevFactor = 1;
    mStretchType = StretchType.MIN_MAX;
    // retrieve the MapView from layout
    mMapView = (MapView) findViewById(R.id.mapView);
    mFragmentManager = getSupportFragmentManager();
    // define permission to request
    String[] reqPermission = new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE };
    int requestCode = 2;
    // For API level 23+ request permission at runtime
    if (ContextCompat.checkSelfPermission(MainActivity.this,
        reqPermission[0]) == PackageManager.PERMISSION_GRANTED) {
    } else {
      // request permission
      ActivityCompat.requestPermissions(MainActivity.this, reqPermission, requestCode);

   * Using values stored in strings.xml, builds path to raster.
   * @return the path to raster file
  private String buildRasterPath(String filename) {
    // get sdcard resource name
    File extStorDir = Environment.getExternalStorageDirectory();
    // get the directory
    String extSDCardDirName = this.getResources().getString(R.string.data_sdcard_offline_dir);
    // create the full path to the raster file
    return extStorDir.getAbsolutePath()
        + File.separator
        + extSDCardDirName
        + File.separator
        + filename
        + ".tif";

   * Creates new imagery raster based on a given path, creates an ArcGISMap, sets it to a MapView and
   * calls updateRenderer().
  private void initialize() {
    // create raster
    Raster raster = new Raster(
        new File(buildRasterPath(this.getString(R.string.raster_name))).getAbsolutePath());
    mRasterLayer = new RasterLayer(raster);
    // create a basemap from the raster layer
    Basemap basemap = new Basemap(mRasterLayer);
    ArcGISMap map = new ArcGISMap(basemap);
    // add the map to a map view

   * Creates StretchRenderer of the chosen type: MinMax, PercentClip or StandardDeviation.
  private void updateRenderer() {
    StretchParameters stretchParameters;
    switch (mStretchType) {
        stretchParameters = new MinMaxStretchParameters(
            Arrays.asList((double) mMinR, (double) mMinG, (double) mMinB),
            Arrays.asList((double) mMaxR, (double) mMaxG, (double) mMaxB));
      case PERCENT_CLIP:
        stretchParameters = new PercentClipStretchParameters(mPercentClipMin, mPercentClipMax);
        stretchParameters = new StandardDeviationStretchParameters(mStdDevFactor);
    RGBRenderer rgbRenderer = new RGBRenderer(stretchParameters, Arrays.asList(0, 1, 2), null, true);

   * Handle the permissions request response.
  public void onRequestPermissionsResult(int requestCode,
      @NonNull String[] permissions,
      @NonNull int[] grantResults) {
    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    } else {
      // report to user that permission was denied

  public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.rgb_parameters, menu);
    return super.onCreateOptionsMenu(menu);

  public boolean onOptionsItemSelected(MenuItem item) {
    //send parameters to fragment
    ParametersDialogFragment paramDialog = new ParametersDialogFragment();
    Bundle rgbParameters = new Bundle();
    rgbParameters.putInt("minR", mMinR);
    rgbParameters.putInt("maxR", mMaxR);
    rgbParameters.putInt("minG", mMinG);
    rgbParameters.putInt("maxG", mMaxG);
    rgbParameters.putInt("minB", mMinB);
    rgbParameters.putInt("maxB", mMaxB);
    rgbParameters.putInt("percent_clip_min", mPercentClipMin);
    rgbParameters.putInt("percent_clip_max", mPercentClipMax);
    rgbParameters.putInt("std_dev_factor", mStdDevFactor);
    rgbParameters.putSerializable("stretch_type", mStretchType);
    paramDialog.show(mFragmentManager, "param_dialog");
    return super.onOptionsItemSelected(item);

  protected void onPause() {

  protected void onResume() {

  enum StretchType {
    MIN_MAX("Min Max"),
    PERCENT_CLIP("Percent Clip"),
    STANDARD_DEVIATION("Standard Deviation");

    private final String stringValue;

    StretchType(String toString) {
      stringValue = toString;

    @Override public String toString() {
      return stringValue;