0

チェッカーボード パターンを重ねたい画像があります。これは私がこれまでに思いついたものです:

for ( uint_8 nRow = 0; nRow < image.width(); ++nRow)
        for (uint_8 nCol = 0; nCol < image.height(); ++nCol)
                  if(((nRow/20 + nCol/20) % 2) == 0)
                        memset(&image.data[nCol + nRow], 0, 1);

残念ながら白い画像を生成します。memset複数ではなく画像内のすべてのピクセルに対して呼び出されるため、これは非常にパフォーマンスが高いとは思いません。このコードがチェッカーボード パターンを生成しないのはなぜですか? どのように改善しますか?

4

2 に答える 2

2

パフォーマンスを向上させるために、画像を 2 次元エンティティとして扱わないでください。代わりに、画像のすべての行が次々に配置されている連続データの 1D 配列として見てください。

このアプローチでは、パターンを 1 回のループで一度に記述することができます。繰り返しのたびに memset() 複数の隣接するピクセルを使用し、設定したピクセルの量の 2 倍だけインデックスを増やします。

int data_size = image.width() * image.height();
for (auto it = image.data; it < image.data + data_size; it += 20) {
    memset(it, 0, 20);
    if (((it - data) + 40) % (20 * 400) == 0) {
        it += 40;
    } else if (((it - data) + 20) % (20 * 400) != 0) {
        it += 20;
    }
}

( C++11 を使用していない場合はauto、 の型に置き換えてください。おそらく.)image.dataunsigned char*

これは、CPU キャッシュのプリフェッチに非常に適しています。また、コンパイラーにとっても使いやすく、潜在的にベクトル化および/またはループ展開を実行できます。

于 2013-08-07T12:18:53.333 に答える
0

チェッカーの正方形サイズの倍数である画像の寸法がある場合: (私は C でコーディングしましたが、C++ に転置するのはかなり簡単です)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define uint unsigned int
#define WIDTH  40
#define HEIGHT 40
#define BLOCK_SIZE 5

void create_checker_row(uint* row, uint size_block, uint nb_col, uint offset )
{
    uint ic;
    for (ic = size_block*offset ; ic < nb_col; ic+= 2*size_block )
    {
        memset( (row + ic) , 0, size_block*sizeof(uint) );
    }
}

int main()
{
    uint ir,ic;

    // image creation
    uint* pixels = (uint*) malloc(WIDTH*HEIGHT*sizeof(uint));
    for (ir = 0; ir < WIDTH; ir++)
    {
        for ( ic = 0; ic < HEIGHT; ic++)
        {
            // arbitrary numbers
            pixels[ir*WIDTH + ic] = (ir*WIDTH + ic) % 57 ;
            printf("%d,", pixels[ir*WIDTH + ic] );
        }
        printf("\n");
    } 

    for (ir = 0; ir < WIDTH; ir++)
    {
        create_checker_row( pixels + ir*WIDTH   , // pointer at the beggining of n-th row
                            BLOCK_SIZE          , // horizontal length for square
                            WIDTH               , // image width
                            (ir/BLOCK_SIZE) % 2   // offset to create the checker pattern
                            );
    }

    // validation
    printf("\n");
    printf("Validation \n");
    printf("\n");
    for (ir = 0; ir < WIDTH; ir++)
    {
        for ( ic = 0; ic < HEIGHT; ic++)
        {
            printf("%d,", pixels[ir*WIDTH + ic] );
        }
        printf("\n");
    }

    return 0;
}

私にとってはかなり市松模様のようです: http://ideone.com/gp9so6

于 2013-08-07T13:11:30.460 に答える