Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Bitmap.ScanLine
как работает процедура?

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

deep

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
может ли кто объяснить как действует эта процедура?  

Всего записей: 19 | Зарегистр. 29-03-2003 | Отправлено: 18:25 06-04-2003
hog



oink
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
возвращает указатель на строку с нужным номером. в хелпе есть подробный пример.
P : PByteArray;
.....
P := BitMap.ScanLine[10]; // получаем указатель на 10 строчку
P[5] := ...;  // работаем с 5 пикселем

Всего записей: 1141 | Зарегистр. 14-12-2001 | Отправлено: 20:01 06-04-2003
deep

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
да в help-е есть пример, но я самого механизма не поняла (((
если мы получаем указатель на 10-ю строчку, то P[5] - это 5-й пиксел? а не еще не 2-й? и что делится на 3? и в чем разница в форматах:pixelFormat: pf24bit  pf4bit и т.д. я эксперементировала, у меня то цветной получается, то черно-белый переход... но по любому больше 255 на одну ячейку в массиве P нельзя указать...
я скачала процедурку, в которой одно изображение плавно сменяет другое, но это если они одного размера, или большее обрезать, а я хотела попробовать на разных размерах, но не понимаю как действует в строке ScanLine --- не получается правильно...

Всего записей: 19 | Зарегистр. 29-03-2003 | Отправлено: 12:19 08-04-2003
Pinocchio

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
deep
Как Вы догадываетесь - картинки бывают разных форматов (чёрно-белый,16 цветов, 256 цветов...). Следовательно они хранят различные данные. Свойство Pixels[x,y] возвращает данные о точке преобразованные в тип TColor. ScanLine возвращает адрес непреобразованных данных, специально для тех кто умеет работать с их форматом и может написать более быстрые процедуры. Качество данных всегда зависит от pfXXbit.
В Вашем случае лучше использовать Pixels и Lock/Unlock.

----------
Meaning this is something additional.

Всего записей: 683 | Зарегистр. 18-11-2002 | Отправлено: 15:29 09-04-2003
deep

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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);
       

Всего записей: 19 | Зарегистр. 29-03-2003 | Отправлено: 12:50 11-04-2003
UncoNNecteD



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
deep
Думаю надо ресайзить картинку.

Всего записей: 4040 | Зарегистр. 21-03-2002 | Отправлено: 15:00 11-04-2003
deep

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
вот что я нашла... если кому еще интересно о Scanlines:
http://bdn.borland.com/article/0,1410,29173,00.html

Всего записей: 19 | Зарегистр. 29-03-2003 | Отправлено: 18:16 11-08-2003
phi1

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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.

Всего записей: 531 | Зарегистр. 19-03-2003 | Отправлено: 12:05 12-08-2003
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Bitmap.ScanLine


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.B0ard 2000-2026

LiteCoin: LgY72v35StJhV2xbt8CpxbQ9gFY6jwZ67r

Рейтинг.ru