Преобразование цветного изображения в серое по алгоритму Gra

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Преобразование цветного изображения в серое по алгоритму Gra

Сообщение shyub » 21.02.2016 18:57:19

На http://guildalfa.ru/alsha/node/14 приводится этот алгоритм. Использую 2-й вариант.
Код: Выделить всё
// Перевод цветных пикселей в серые.
procedure TForm1.Grayscale(pBuf: pInteger; Count: integer);
var
  MyColor: integer;
begin;
  repeat
    MyColor:=pBuf^;
    pBuf^:=((29 * (MyColor and $FF)  //Blue
          + 150 * ((MyColor shr 8)  and $FF)  //Green
          + 77 * ((MyColor shr 16) and $FF)  //Red
          ) shr 8 ) * $00010101;
    dec(Count);
    inc(pBuf);
  until Count<=0;
end;
// Замена цвета в битовой матрице на серый.
procedure TForm1.ShaBitmapToGrayscale1(Bitmap: TBitmap);
var
  p, q: pInteger;
begin;
   with Bitmap do begin
    p:=ScanLine[Height-1];
    q:=ScanLine[0];
    if cardinal(p)>cardinal(q) then p:=q;
    Grayscale(p, Height * Width);
  end;
end;

При компиляции Lazarus выдаёт сообщения:
unit1.pas(94,16) Warning: Symbol "ScanLine" is not portable
unit1.pas(95,16) Warning: Symbol "ScanLine" is not portable
unit1.pas(96,8) Hint: Conversion between ordinals and pointers is not portable
unit1.pas(96,20) Hint: Conversion between ordinals and pointers is not portable
Ему (компилятору) явно не нравится функции Bitmap.ScanLine, хотя она определена в graphics.pp(1387,14) и я как понимаю она передаёт указатель на строку битовой матрицы. Чем можно её заменить, т.к. при отладке видно, что p и q не инициализируются. Назначение строки
Код: Выделить всё
if cardinal(p)>cardinal(q) then p:=q;
мне вообще не понятно, зачем надо сравнивать указатели, да и при этом исполь cardinal()?
shyub
постоялец
 
Сообщения: 112
Зарегистрирован: 25.11.2014 23:15:19

Re: Преобразование цветного изображения в серое по алгоритму

Сообщение Дож » 21.02.2016 19:18:19

Этим сравнением определяется начало области памяти с изображением, т.к., видимо, линии могут идти в реверсном порядке. Для избавления от двух хинтов нужно заменить cardinal на PtrUInt.

Для избавления от варинингов нужно изучать библиотеку подробнее, смотреть какие есть кросс-платформенные альтернативы такому использованию ScanLine.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 14

Рейтинг@Mail.ru