из С++ в delphi

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
ГригорийOSS
Сообщения: 1
Зарегистрирован: 15 сен 2013, 07:49

15 сен 2013, 08:00

Доброго времени. Помогите плиз с решением небольшой проблемки.

из Си переписываю функцию.
uint32_t Color(byte r, byte g, byte b)
{
uint32_t c;
c = r;
c <<= 8;
c |= g;
c <<= 8;
c |= b;
return c;
}

на delphi пытаюсь получить аналог

procedure TForm1.Button1Click(Sender: TObject);
var Bitmap:TBitmap;
JPEGImage:TJPEGImage;
r, g, b, i, j: integer;
rr,gg,bb: byte;
rrrrrrrrr:Longint;
begin
JPEGImage:=TJPEGImage.Create;
JPEGImage.LoadFromFile('E:\Document s and Settings\1\Рабочий стол\111111111.jpg');
Bitmap:=TBitmap.Create;
Bitmap.Assign(JPEGImage);
Image1.Picture.Bitmap:=Bitmap;
Bitmap.Destroy;
JPEGImage.Destroy;
//Image1.Height := Image1.Height * 3;
// Image1.Width := Image1.Width * 3;
for i := 0 to Image1.Width do
for j := 0 to Image1.Height do
begin
r := GetRValue(Image1.Picture.Bitmap.Can vas.Pixels[i, j]);
g := GetGValue(Image1.Picture.Bitmap.Can vas.Pixels[i, j]);
b := GetBValue(Image1.Picture.Bitmap.Can vas.Pixels[i, j]);
rr:=r;
gg:=g;
bb:=b;
//rrrrrrrrr:=Color(RGB(rr,gg,bb));
rrrrrrrrr:=Colorееее(GetRValue(Imag e1.Picture.Bitmap.Canvas.Pixels[i, j]),GetGValue(Image1.Picture.Bitmap.C anvas.Pixels[i, j]),GetBValue(Image1.Picture.Bitmap.C anvas.Pixels[i, j]));
//Memo1.Lines.Add(Color(rr,gg,bb));
end;
end;


function Color(r,g,b:byte):Cardinal;
var c:Cardinal;
begin
c := r;
c := c Shl 8;
c := c or g;
c := c Shl 8;
c := c or b;
Result c ;
end;

на строке rrrrrrrrr:=Colorееее(GetRValue(Imag e1.Picture.Bitmap.Canvas.Pixels[i, j]),GetGValue(Image1.Picture.Bitmap.C anvas.Pixels[i, j]),GetBValue(Image1.Picture.Bitmap.C anvas.Pixels[i, j])); дает ошибку [Error] Unit1.pas(75): Missing operator or semicolon.
Видимо туплю на какой то мелочи.
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

15 сен 2013, 12:10

Слуаем не RGB(rr,gg,bb) ли функция принимает? Оберните в RGB(GetRValu..,GetRValu..,GetRValu..)
[syntax=Delphi] [/syntax]
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

15 сен 2013, 16:46

Я что-то не вижу определения Coloreeee...
Не судьба, кстати, упростить? Знаете сколько времени выполняется каждый вызов Image1.Picture.Bitmap.Canvas.Pixels[i, j] - там время в десятках микросекунд, убийственно долго. Это не просто массив - это виртуальное отражение видеопамяти, а там не факт что два соседних пикселя по соседним адресам сидят. Все это использует довольно много далеко не быстрых функций GDI. Обращение к Canvas.Pixels или Scanline нужно выполнять как можно реже или вообще отказаться от них.
Во-вторых GetRValue(X) эквивалентно X and 0FFh, GetGValue(X) - эквивалент (X and 0FF00h) shr 8 и так далее.
Наведите порядок в коде и когда он раза в три меньше станет, все ошибки сами всплывут.
It's a long way to the top if you wanna rock'n'roll
Ответить