Nadesłany przez Tomasz Lubiński, 20 lipca 2011 14:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
Ordered - Bayer Table - C++/Unit1.cpp:
//Tomasz Lubiński (C)2009
// http://www.algorytm.org
//Uporzadkowane rozpraszanie bledow - tablice Bayer'a
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "math.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
typedef struct Pixel
{
Byte b;
Byte g;
Byte r;
Byte reserved;
} TPixel;
/* tablica Bayer'a */
int bayer[16][16];
/* funkcje do wygenerowanie tablicy Bayer'a */
int getX(int i, int level, int shift)
{
int result = ((i+1) % 2);
if (level == 1)
{
return result + shift;
}
return getX(i/4, level-1, shift + result * pow(2, level-1));
}
int getY(int i, int level, int shift)
{
int result = (((i+3) % 4) / 2);
if (level == 1)
{
return result + shift;
}
return getY(i/4, level-1, shift + result * pow(2, level-1));
}
void prepareBayerTable(int level)
{
int size, i, x, y;
size = pow(2, level);
for (i=0; i<size*size; i++)
{
x = getX(i, level, 0);
y = getY(i, level, 0);
bayer[x][y] = (i+1);
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i,j,bayerSize;
float p;
TPixel *pixelOrg, *pixelNew, white, black;
//przygotuj wartosci bialy i czarny
white.b = 255;
white.g = 255;
white.r = 255;
black.b = 0;
black.g = 0;
black.r = 0;
//przygotuj obrazy wynikowe
Image2->Canvas->Brush->Color = clWhite;
Image2->Canvas->Rectangle(0, 0, Image2->Width, Image2->Height);
Image2->Picture->Bitmap->PixelFormat = pf32bit;
Image3->Canvas->Brush->Color = clWhite;
Image3->Canvas->Rectangle(0, 0, Image3->Width, Image3->Height);
Image3->Picture->Bitmap->PixelFormat = pf32bit;
//przygotuj format obrazu zrodlowego
Image1->Picture->Bitmap->PixelFormat = pf32bit;
//pobierz prog
p = StrToInt(Form1->Edit1->Text);
//zwykle progowe
for (j=0; j<230; j++){
pixelOrg = (TPixel *)Image1->Picture->Bitmap->ScanLine[j];
pixelNew = (TPixel *)Image2->Picture->Bitmap->ScanLine[j];
for (i=0; i<248; i++){
if (p > pixelOrg->r)
*pixelNew = black;
else
*pixelNew = white;
pixelOrg++;
pixelNew++;
}
}
//uporzadkowane rozpraszanie bledow
//przygotuj tablice Bayer'a
prepareBayerTable(ComboBox1->ItemIndex + 1);
bayerSize = pow(2, ComboBox1->ItemIndex + 1);
p /= (float)(bayerSize*bayerSize);
for (j=0; j<230; j++){
pixelOrg = (TPixel *)Image1->Picture->Bitmap->ScanLine[j];
pixelNew = (TPixel *)Image3->Picture->Bitmap->ScanLine[j];
for (i=0; i<248; i++){
if (p * bayer[i % bayerSize][j % bayerSize] > pixelOrg->r) {
*pixelNew = black;
} else {
*pixelNew = white;
}
pixelOrg++;
pixelNew++;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Label6Click(TObject *Sender)
{
ShellExecute(Application->Handle,
"open",
"http://www.algorytm.org",
NULL,
NULL,
SW_NORMAL);
}
//---------------------------------------------------------------------------

