2

これは、この質問のフォローアップです。

私はテキストを描画する必要がある低レベルのCアプリに取り組んでいます。使用したいフォント(白黒、各文字128x256など)を配列として保存することにしました。次に、アルゴリズムを使用して必要なサイズにダウンスケールします(グレースケールとして、粗雑なフォントを使用できます)。フォントスムージング)。

注:これはおもちゃのプロジェクトです。実行時に計算を行うかどうかなどは無視してください。

質問は、どのアルゴリズムですか?

調べました2xSaIが、かなり複雑です。説明を読んで自分でコードを作成できるものが欲しいです(私は初心者で、C / C ++で1年弱コーディングしています)。

提案、誰か?

御時間ありがとうございます!

編集:入力は白黒であり、出力は平滑化されたグレースケールであることに注意してください

4

5 に答える 5

4

宛先ピクセルに対応するソース イメージ内の四角形を見つけます。たとえば、ソース イメージが 50x100 で、宛先が 20x40 の場合、宛先の左上のピクセルは、ソース イメージの (0,0) から (2.2,2.2) までの四角形に対応します。次に、これらのピクセルの面積平均を行います。

  • 面積は 2.2 * 2.2 = 4.84 です。結果を 1/4.84 でスケーリングします。
  • (0,0)、(0,1)、(1,0)、および (1,1) のピクセルは、それぞれ 1 単位で重み付けされます。
  • (0,2)、(1,2)、(2,0)、および (2,1) のピクセルは、それぞれ 0.2 単位で重み付けされます (長方形はそれらの 20% しかカバーしないため)。
  • (2,2) のピクセルの重みは 0.04 です (四角形はピクセルの 4% しかカバーしていないため)。
  • 総重量はもちろん 4*1 + 4*0.2 + 0.04 = 4.84 です。

これは簡単でした。ソース ピクセルとデスティネーション ピクセルを画像の端に均等に配置することから始めたからです。一般に、スライドする長方形の 4 つの辺と 4 つの角すべてが部​​分的にカバーされます。

縮小のための面積平均以外のアルゴリズムを気にしないでください。それらのほとんどは明らかに間違っています(少なくとも 1/2 未満の係数で恐ろしいエイリアシングが発生します)。明らかに間違っていないものは、実装するのがかなり面倒で、おそらくより良い結果は得られません。 .

于 2010-11-14T22:28:58.343 に答える
3

画像が N*M BW ビットマップであると考えてください。簡単にするためにchar Letter[N][M]、許容値が0との場合、 と見なします1。にダウンスケールするとしunsigned char letter[n][m]ます。これは、からの各グレースケール ピクセルletterが大きなビットマップ内の白いピクセルの数として計算されることを意味します。

char Letter[N][M];
unsigned char letter[n][m];
int rect_sz_X = N / n; // the size of rectangle that will map to a single pixel
int rect_sz_Y = M / m; // in the downscaled image
int i, j, x, y;
for (i = 0; i < n; i++) for (j = 0; j < m; j++){
    int sum = 0;
    for (x = 0; x < rect_sz_X; x++) for (y = 0; y < rect_sz_Y; y++)
        sum += Letter[i*rect_sz_X + x][j*rect_sz_Y + y];
    letter[n][m] = ( sum * 255) / (rect_sz_X * rect_sz_Y);
};

ピクセルを作成する長方形が重なる可能性があることに注意してください (サイズが割り切れない場合)。元のビットマップが大きいほど良いです。

于 2010-11-14T22:22:03.010 に答える
2

ビットマップ フォントのスケーリングは、他のビットマップのスケーリングと同じ問題です。あなたが求めているアルゴリズムの一般的なクラスは補間です。これを行うにはいくつかの方法があります。一般に、結果が視覚的に正確であるほど、アルゴリズムは複雑になります。あなたは(複雑さの昇順で)見ることから始めることができます:

于 2010-11-14T22:03:34.923 に答える
1

とても簡単です。アウトラインフォントではなくビットビットフォントしか使用できない場合は、アンチエイリアシングピクセルカラーを選択する際の選択肢が非常に限られています。たとえば、ビットマップフォントのポイントサイズが目的の表示ポイントサイズのちょうど4倍である場合、16の異なる選択肢しか取得できません。4x4マッピング長方形の「点灯」ピクセルの数。

分数マッピングを処理する必要があるのはプログラミングの練習ですが、品質を向上させるものではありません。

于 2010-11-14T22:41:15.477 に答える
0

ダウンスケーリングを 2 の倍数 (50%、25%、12.5% など) に制限することが許容される場合、非常に単純でかなり優れたアルゴリズムは、すべてのソース ピクセルの多数決として各ダウンスケーリング ピクセルを作成することです。たとえば、50% では、4 ピクセルの正方形が縮小された 1 つのピクセルを形成します。ゼロまたはそのうちの 1 つがオンの場合、出力はオフになります。3 つまたは 4 つがオンの場合、出力はオンです。芸術的なケース (2 つのピクセルがオンの場合) では、常にオンまたはオフを選択するか、タイブレークのために周囲の他のピクセルを調べます。

于 2010-11-14T22:06:21.527 に答える