Перевод кода
Добавлено: 09.12.2008 21:26:15
Здравствуйте, помогите пожалуйста с таким вопросом, я пишу программу на Free Pascal и мне понадобилось в этой программе использовать функцию которая написана на C++. Вот собственно код (конвертация RGB to Grayscale)
остальную часть кода я опускаю. Помогите перевести этот код на Паскаль. Я пробовал реализовывать эту функцию с использованием SetPixel & GetPixel, но изображение в таком случае обрабатывается очень долго.
P.S.
Кому нужно даю весь код:
- Код: Выделить всё
void Paint()
{
COLORREF *pvbits;
pvbits = (COLORREF *)malloc(240*240*4); //массив пикселей изображения
for (int j=0; j<240; j++) //конвертируем все пиксели изображения из цветных в grayscale
{
for (int i=0; i<240; i++)
{
BYTE* pPixel = (BYTE *)(&pvbits[i+240*j]);
int rgb = ((11*pPixel[0]+30*pPixel[2]+59*pPixel[1])/100);
pPixel[0]=rgb;
pPixel[1]=rgb;
pPixel[2]=rgb;
}
}
free(pvbits);
}
остальную часть кода я опускаю. Помогите перевести этот код на Паскаль. Я пробовал реализовывать эту функцию с использованием SetPixel & GetPixel, но изображение в таком случае обрабатывается очень долго.
P.S.
Кому нужно даю весь код:
- Код: Выделить всё
void onPaint(HWND hWnd)
{
HGDIOBJ bmp, oldbmp;
HDC hdc, hdc2, ScreenDC;
PAINTSTRUCT ps;
BITMAPINFO bmi;
COLORREF *pvbits;
pvbits = (COLORREF *)malloc(240*240*4); //массив пикселей изображения
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); //создаем структуру, хранящую данные об изображении
bmi.bmiHeader.biHeight = 240;
bmi.bmiHeader.biWidth = 240;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage=0;
bmi.bmiHeader.biClrUsed=0;
bmi.bmiHeader.biClrImportant=0;
hdc = BeginPaint(hWnd, &ps);
ScreenDC = GetDC(0);
hdc2 = CreateCompatibleDC(NULL);
bmp = CreateDIBSection(hdc2, &bmi, DIB_RGB_COLORS, (VOID **)&pvbits, NULL, 0x0);
oldbmp = SelectObject(hdc2, bmp);
BitBlt(hdc2, 0, 0, 240, 240, ScreenDC, 0, 0, SRCCOPY);
for (int j=0; j<240; j++) //конвертируем все пиксели изображения из цветных в grayscale
{
for (int i=0; i<240; i++)
{
BYTE* pPixel = (BYTE *)(&pvbits[i+240*j]);
int rgb = ((11*pPixel[0]+30*pPixel[2]+59*pPixel[1])/100);
pPixel[0]=rgb;
pPixel[1]=rgb;
pPixel[2]=rgb;
}
}
BitBlt(hdc, 0, 0, 240, 240, hdc2, 0, 0, SRCCOPY); //выводим полученное на экран
EndPaint(hWnd, &ps);
SelectObject(hdc2, oldbmp);
DeleteDC(hdc2);
DeleteObject(bmp);
ReleaseDC(hWnd, ScreenDC);
free(pvbits);
}