1

この質問に似たものを作成したいと思います画像をドットのグリッドに変換できますか? しかし、私の問題に対する答えが見つかりません。基本的な考え方は、電話から画像を読み込み、このドットのグリッドを適用することです。これに対する提案をいただければ幸いです。

4

2 に答える 2

3

他の人が示唆しているように、OpenGL シェーディング言語 (GLSL) のフラグメント シェーダーを使用して問題を解決することもできます。GLSL では面倒なセットアップが必要になる場合があります。

Android Renderscript を使用した私のソリューションを次に示します (GLSL によく似ていますが、特に Android 用に設計されています。あまり使用されていません)。まず、公式の Android SDK サンプル内から Renderscript > Hello Compute サンプルをセットアップします。次に、mono.rs を次のように置き換えます。

#pragma version(1)
#pragma rs java_package_name(com.android.example.hellocompute)

rs_allocation gIn;
rs_allocation gOut;
rs_script gScript;

static int mImageWidth;
const uchar4 *gPixels;

const float4 kBlack = {
    0.0f, 0.0f, 0.0f, 1.0f
};

// There are two radius's for each circle for anti-aliasing reasons. 
const static uint32_t radius = 15; 
const static uint32_t smallerRadius = 13;

// Used so that we have smooth circle edges
static float smooth_step(float start_threshold, float end_threshold, float value) {
    if (value < start_threshold) {
        return 0;
    }
    if (value > end_threshold) {
        return 1;
    }
    value = (value - start_threshold)/(end_threshold - start_threshold);
    // As defined at http://en.wikipedia.org/wiki/Smoothstep
    return value*value*(3 - 2*value);
}

void root(const uchar4 *v_in, uchar4 *v_out, uint32_t u_x, uint32_t u_y) {
    int32_t diameter = radius * 2;

    // Compute distance from center of the circle
    int32_t x = u_x % diameter - radius;
    int32_t y = u_y % diameter - radius;
    float dist = hypot((float)x, (float)y);

    // Compute center of the circle
    uint32_t center_x = u_x /diameter*diameter + radius;
    uint32_t center_y = u_y /diameter*diameter + radius;

    float4 centerColor = rsUnpackColor8888(gPixels[center_x + center_y*mImageWidth]);
    float amount = smooth_step(smallerRadius, radius, dist);
    *v_out = rsPackColorTo8888(mix(centerColor, kBlack, amount));
}

void filter() {
    mImageWidth = rsAllocationGetDimX(gIn);
    rsForEach(gScript, gIn, gOut); // You may need a forth parameter, depending on your target SDK.
}

HelloCompute.java 内で、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.bind_gPixels(mInAllocation);

        mScript.set_gIn(mInAllocation);
        mScript.set_gOut(mOutAllocation);
        mScript.set_gScript(mScript);
        mScript.invoke_filter();
        mOutAllocation.copyTo(mBitmapOut);
}

最終結果は次のようになります ここに画像の説明を入力

各ドットを単色にする必要がない場合は、次のことができます。

これを行うには非常に簡単な方法があります。BitmapDrawable画像にはが必要BitmapDrawableで、オーバーレイ タイルには が必要です ( と呼びましょうoverlayTile)。オンoverlayTile、コール

overlayTile.setTileModeX(Shader.TileMode.REPEAT);
overlayTile.setTileModeY(Shader.TileMode.REPEAT);

次に、LayerDrawableを使用Drawableして 2 つを1 つに結合します。必要に応じて、一部の src として結果を使用できます。または、 を に変換しディスクに保存することもできます。DrawableLayerDrawableImageViewDrawableBitmap

于 2013-02-01T06:08:16.963 に答える
1

OpenGLを勉強することは、あなたが達成したいことに役立つかもしれないと思います.

OpenGL ES を使用したグラフィックスの表示の基本を確認することをお勧めします。

それが役立つことを願っています。:)

于 2013-02-01T03:51:35.587 に答える