Освой программирование играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Renderscript

Статья писалась в 2013 году. Возможно, сейчас что-то изменилось.
Upd. Действительно изменилось. Смотри новую статью

Renderscript - отдельная технология для работы с графикой и 3D на низком уровне, способная быстро работать с изображениями.

Признаться, предварительное знакомство с Renderscript оставило меня в недоумении. Сама Google не так много говорит об этой технологии - примеров раз, два и обчёлся. Кроме того, с версии Android 16 там что-то поменяли, и все старые примеры из интернета, которые я хотел изучить, пошли коту под хвост - Eclipse стал ругаться, что все эти классы и методы устарели.

Я так и не понял, стоит ли интересоваться данной технологией дальше или не обращать на неё внимания. Даже документация написана как-то неряшливло и непонятно. А примеры из документации у меня даже не заработали как надо, пришлось самостоятельно разбираться и исправлять ляпы в проекте. Поэтому оставлю статью с заделом на будущее. Может потом вернёмся к этой теме.

Разработка с использованием Renderscript немного отличается от создания обычного приложения. Создайте новый проект для API 16 и выше. Разметка для основной активности:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/displayin"
        android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" />

    <ImageView
        android:id="@+id/displayout"
        android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" />

</LinearLayout>

Далее в в папке src/имя_пакета создайте новый файл с расширением rs, например, mono.rs следующего содержания:


#pragma version(1)
#pragma rs java_package_name(ru.alexanderklimov.renderscriptdemo)

//multipliers to convert a RGB colors to black and white
const static float3 gMonoMult = {0.299f, 0.587f, 0.114f};

void root(const uchar4 *v_in, uchar4 *v_out) {
  //unpack a color to a float4
  float4 f4 = rsUnpackColor8888(*v_in);
  //take the dot product of the color and the multiplier
  float3 mono = dot(f4.rgb, gMonoMult);
  //repack the float to a color
  *v_out = rsPackColorTo8888(mono);
}

Данный файл является скриптом перевода цветного изображения в черно-белый. Во второй строчке в скобках нужно указать свой пакет. Когда вы сохраните данных документ, то в папке res/raw появится файл mono.bc. Не обращаем на него внимания, трогать не надо.

Теперь откроем класс активности и напишем код:


package ru.alexanderklimov.renderscriptdemo;

import android.os.Bundle;
import android.renderscript.Allocation;
import android.renderscript.RenderScript;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.widget.ImageView;

public class MainActivity extends Activity {

	private Bitmap mBitmapIn;
	private Bitmap mBitmapOut;

	private RenderScript mRS;
	private Allocation mInAllocation;
	private Allocation mOutAllocation;
	private ScriptC_mono mScript;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		mBitmapIn = loadBitmap(R.drawable.data);
		mBitmapOut = Bitmap.createBitmap(mBitmapIn.getWidth(),
				mBitmapIn.getHeight(), mBitmapIn.getConfig());

		ImageView in = (ImageView) findViewById(R.id.displayin);
		in.setImageBitmap(mBitmapIn);

		ImageView out = (ImageView) findViewById(R.id.displayout);
		out.setImageBitmap(mBitmapOut);

		createScript();
	}

	private void createScript() {
		mRS = RenderScript.create(this);
		mInAllocation = Allocation.createFromBitmap(mRS, mBitmapIn,
				Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
		mOutAllocation = Allocation.createTyped(mRS, mInAllocation.getType());
		mScript = new ScriptC_mono(mRS, getResources(), R.raw.mono);
		mScript.forEach_root(mInAllocation, mOutAllocation);
		mOutAllocation.copyTo(mBitmapOut);
	}

	private Bitmap loadBitmap(int resource) {
		final BitmapFactory.Options options = new BitmapFactory.Options();
		options.inPreferredConfig = Bitmap.Config.ARGB_8888;
		return BitmapFactory.decodeResource(getResources(), resource, options);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

В папку res/drawable поместите любое цветное изображение с именем data.png, которое будет загружаться в ImageView.

Запускаем проект и смотрим на результат.

Renderscript

Дополнительное чтение

RenderScript in the Android Support Library | Android Developers Blog

Реклама