может ли кто объяснить как действует эта процедура?
» Bitmap.ScanLine
возвращает указатель на строку с нужным номером. в хелпе есть подробный пример.
P : PByteArray;
.....
P := BitMap.ScanLine[10]; // получаем указатель на 10 строчку
P[5] := ...; // работаем с 5 пикселем
P : PByteArray;
.....
P := BitMap.ScanLine[10]; // получаем указатель на 10 строчку
P[5] := ...; // работаем с 5 пикселем
да в help-е есть пример, но я самого механизма не поняла (((
если мы получаем указатель на 10-ю строчку, то P[5] - это 5-й пиксел? а не еще не 2-й? и что делится на 3? и в чем разница в форматах:pixelFormat: pf24bit pf4bit и т.д. я эксперементировала, у меня то цветной получается, то черно-белый переход... но по любому больше 255 на одну ячейку в массиве P нельзя указать...
я скачала процедурку, в которой одно изображение плавно сменяет другое, но это если они одного размера, или большее обрезать, а я хотела попробовать на разных размерах, но не понимаю как действует в строке ScanLine --- не получается правильно...
если мы получаем указатель на 10-ю строчку, то P[5] - это 5-й пиксел? а не еще не 2-й? и что делится на 3? и в чем разница в форматах:pixelFormat: pf24bit pf4bit и т.д. я эксперементировала, у меня то цветной получается, то черно-белый переход... но по любому больше 255 на одну ячейку в массиве P нельзя указать...
я скачала процедурку, в которой одно изображение плавно сменяет другое, но это если они одного размера, или большее обрезать, а я хотела попробовать на разных размерах, но не понимаю как действует в строке ScanLine --- не получается правильно...
deep
Как Вы догадываетесь - картинки бывают разных форматов (чёрно-белый,16 цветов, 256 цветов...). Следовательно они хранят различные данные. Свойство Pixels[x,y] возвращает данные о точке преобразованные в тип TColor. ScanLine возвращает адрес непреобразованных данных, специально для тех кто умеет работать с их форматом и может написать более быстрые процедуры. Качество данных всегда зависит от pfXXbit.
В Вашем случае лучше использовать Pixels и Lock/Unlock.
Как Вы догадываетесь - картинки бывают разных форматов (чёрно-белый,16 цветов, 256 цветов...). Следовательно они хранят различные данные. Свойство Pixels[x,y] возвращает данные о точке преобразованные в тип TColor. ScanLine возвращает адрес непреобразованных данных, специально для тех кто умеет работать с их форматом и может написать более быстрые процедуры. Качество данных всегда зависит от pfXXbit.
В Вашем случае лучше использовать Pixels и Lock/Unlock.
Pinocchio
Pixels[x,y] слишком медленно...
Есть процедура которая плавно меняет (прозрачность) одно изображение на другое.
В фрагменте просчитывается и прорисовывается промежуточная картинка. Но картинки должны быть одинакового размера и просчет начинается сверху слева, я хотела сделать более универсальнее процедуру, чтобы можно было использовать разные размеры, т.к. отношение ширины-высоты не у всех картинок могут быть одинаковыми... По высоте регулировать можно строчками по y - т.е. i по ширине это надо работать с x... но как правильно просчитывать сдвиг по x? здесь то у меня и выходит загвоздка...
//просчитываем промежуточную картинку...
for i := 1 to count - 1 do begin
for y := 0 to bm.Height - 1 do begin
p := bm.ScanLine[y];
p1 := bm1.ScanLine[y];
p2 := bm2.ScanLine[y];
for x := 0 to bm.Width * 3 - 1 do
begin
p^[x] := round((p1^[x] * (count - i) + p2^[x] * i) / count);
end;
end;
Form1.Canvas.Draw(0,0, bm);
Pixels[x,y] слишком медленно...
Есть процедура которая плавно меняет (прозрачность) одно изображение на другое.
В фрагменте просчитывается и прорисовывается промежуточная картинка. Но картинки должны быть одинакового размера и просчет начинается сверху слева, я хотела сделать более универсальнее процедуру, чтобы можно было использовать разные размеры, т.к. отношение ширины-высоты не у всех картинок могут быть одинаковыми... По высоте регулировать можно строчками по y - т.е. i по ширине это надо работать с x... но как правильно просчитывать сдвиг по x? здесь то у меня и выходит загвоздка...
//просчитываем промежуточную картинку...
for i := 1 to count - 1 do begin
for y := 0 to bm.Height - 1 do begin
p := bm.ScanLine[y];
p1 := bm1.ScanLine[y];
p2 := bm2.ScanLine[y];
for x := 0 to bm.Width * 3 - 1 do
begin
p^[x] := round((p1^[x] * (count - i) + p2^[x] * i) / count);
end;
end;
Form1.Canvas.Draw(0,0, bm);
deep
Думаю надо ресайзить картинку.
Думаю надо ресайзить картинку.
вот что я нашла... если кому еще интересно о Scanlines:
http://bdn.borland.com/article/0,1410,29173,00.html
http://bdn.borland.com/article/0,1410,29173,00.html
deep
Здесь еще есть примеры использования с различными значениями pixelformat:
http://www.efg2.com/Lab/ImageProcessing/Scanline.htm
А в случае разных по размеру картинок для такого эффекта одну из них все равно придется приводить к размеру другой, IMFHO.
А еще у меня scanline (с 8-битными картинками) отказывается работать под WinMe, а под Win2000 - все нормально.
Вот вроде пример для pixelformat=pf24bit (взял из Delphi Knoledge Base v1.5).
Цитата:
А для pf8bit надо просто объявлять переменную sl как PByteАrray.
Здесь еще есть примеры использования с различными значениями pixelformat:
http://www.efg2.com/Lab/ImageProcessing/Scanline.htm
А в случае разных по размеру картинок для такого эффекта одну из них все равно придется приводить к размеру другой, IMFHO.
А еще у меня scanline (с 8-битными картинками) отказывается работать под WinMe, а под Win2000 - все нормально.
Вот вроде пример для pixelformat=pf24bit (взял из Delphi Knoledge Base v1.5).
Цитата:
type
TRGBArray = array[0..32767] of TRGBTriple;
pRGBArray = ^TRGBArray;
procedure GrayScale(b: TBitmap);
var
i, j, Colr: Integer;
sl: pRGBArray; {Scanline}
begin
if b.PixelFormat <> pf24bit then
begin
ShowMessage('not a truecolor bmp');
Exit;
end;
for j := 0 to b.Height - 1 do
begin
sl := b.ScanLine[j];
for i := 0 to b.Width - 1 do
begin
Colr := HiByte(sl[i].rgbtRed * 77 + sl[i].rgbtGreen * 151 + sl[i].rgbtBlue * 28);
sl[i].rgbtRed := Colr;
sl[i].rgbtGreen := Colr;
sl[i].rgbtBlue := Colr;
end;
end;
end;
А для pf8bit надо просто объявлять переменную sl как PByteАrray.
Страницы: 1
Предыдущая тема: Базы данных Парадокса
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.