Освой программирование играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
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 in the Android Support Library | Android Developers Blog