Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Bitmap.ScanLine

Автор: deep
Дата сообщения: 06.04.2003 17:25
может ли кто объяснить как действует эта процедура?
Автор: hog
Дата сообщения: 06.04.2003 19:01
возвращает указатель на строку с нужным номером. в хелпе есть подробный пример.
P : PByteArray;
.....
P := BitMap.ScanLine[10]; // получаем указатель на 10 строчку
P[5] := ...; // работаем с 5 пикселем
Автор: deep
Дата сообщения: 08.04.2003 11:19
да в help-е есть пример, но я самого механизма не поняла (((
если мы получаем указатель на 10-ю строчку, то P[5] - это 5-й пиксел? а не еще не 2-й? и что делится на 3? и в чем разница в форматах:pixelFormat: pf24bit pf4bit и т.д. я эксперементировала, у меня то цветной получается, то черно-белый переход... но по любому больше 255 на одну ячейку в массиве P нельзя указать...
я скачала процедурку, в которой одно изображение плавно сменяет другое, но это если они одного размера, или большее обрезать, а я хотела попробовать на разных размерах, но не понимаю как действует в строке ScanLine --- не получается правильно...
Автор: Pinocchio
Дата сообщения: 09.04.2003 14:29
deep
Как Вы догадываетесь - картинки бывают разных форматов (чёрно-белый,16 цветов, 256 цветов...). Следовательно они хранят различные данные. Свойство Pixels[x,y] возвращает данные о точке преобразованные в тип TColor. ScanLine возвращает адрес непреобразованных данных, специально для тех кто умеет работать с их форматом и может написать более быстрые процедуры. Качество данных всегда зависит от pfXXbit.
В Вашем случае лучше использовать Pixels и Lock/Unlock.
Автор: deep
Дата сообщения: 11.04.2003 11:50
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);
Автор: UncoNNecteD
Дата сообщения: 11.04.2003 14:00
deep
Думаю надо ресайзить картинку.
Автор: deep
Дата сообщения: 11.08.2003 17:16
вот что я нашла... если кому еще интересно о Scanlines:
http://bdn.borland.com/article/0,1410,29173,00.html
Автор: phi1
Дата сообщения: 12.08.2003 11:05
deep
Здесь еще есть примеры использования с различными значениями 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, истории становления российского интернета. Сделано для людей.