Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.30;
Скачать: CL | DM;

Вниз

property Bitmap.ScanLine   Найти похожие ветки 

 
SMATMP ©   (2005-10-06 18:58) [0]

Уважаемые мастера! Помогите, пожалуста разобраться со свойством Bitmap.ScanLine! Что это такое? Как работать с ним - понятно (из хелпа, примеров), а вот что оно возвращает - нет. Мне для программы было бы неплохо, чтобы информация о пикселах изображения читалась построчно и заносилась в некий массив. ScanLine - это то что мне нужно или нет?


 
Кефир87 ©   (2005-10-06 19:00) [1]

Это указатель на первый байт в строке.


 
SMATMP ©   (2005-10-06 19:18) [2]

Из примера самого Delphi этого как я понимаю не следует...

procedure TForm1.Button1Click(Sender: TObject);

// This example shows drawing directly to the BitMap
var
 x,y : Integer;
 BitMap : TBitMap;
 P : PByteArray;
begin
 BitMap := TBitMap.create;
 try
   BitMap.LoadFromFile("..\Images\Splash\256color\factory.bmp");
   for y := 0 to BitMap.height -1 do
   begin
     P := BitMap.ScanLine[y];
     for x := 0 to BitMap.width -1 do
       P[x] := y;
   end;
 Canvas.draw(0,0,BitMap);

 finally
   BitMap.free;
 end;
end;

В данном случае P : PByteArray присваивается значение данного свойства, а
PByteArray = ^TByteArray;
TByteArray = array[0..32767] of Byte;
из чего следует, что это по меньшей мере 32768 байт...

Или я чего-то не понимаю?


 
Кефир87 ©   (2005-10-06 19:28) [3]

Так в чем проблема я не понял?


 
MBo ©   (2005-10-06 20:49) [4]

>из чего следует, что это по меньшей мере 32768 байт..
Нет, этот метод используется, чтобы можно было обращаться к строке пикселов, как к массиву.
Тип элементов массива можно использовать и другой, если это будет удобно - в зависимости от цветового формата битмапа


 
Sapersky   (2005-10-07 12:00) [5]

PByteArray = ^TByteArray;
TByteArray = array[0..32767] of Byte;
из чего следует, что это по меньшей мере 32768 байт...


Нет. Число там может быть какое угодно, например,
TByteArray = array[0..0] of Byte;
- и результат тот же самый (строго говоря, не совсем; при таком написании нельзя использовать константы в индексах вроде P[1], но оно обычно и не нужно).
При этом фактически используется PByteArray, а не TByteArray. Т.е. эта переменная - указатель (типизированный), сама по себе никаких данных не содержит, но при "навешивании" на сканлайн позволяет обращаться к нему как к байтовому массиву. Делается это именно затем, чтобы не копировать данные в доп. массив, а модифицировать их на месте.

В данном конкретном случае можно использовать обычный указатель, не массив:

Var P : PByte;
<...>
  for y := 0 to BitMap.height -1 do
  begin
    P := BitMap.ScanLine[y];
    for x := 0 to BitMap.width -1 do
      P^ := y; Inc(P);
  end;

Но если требуется обращение к произвольному элементу, или к нескольким одновременно - PByteArray удобнее.
Естественно, если изображение не 8-битное, требуется указатель другого типа, например для 24-битного:

PColorArray = ^TColorArray;
TColorArray = array[0..0] of TRGBTriple;

В общем, RTFM по указателям. Можно ещё посмотреть FastLIB, там масса примеров по сканлайнам и типизированным указателям (в частности, через них реализовано свойство Pixels):

http://prdownloads.sourceforge.net/skinner/FastLib.zip?download


 
SMATMP ©   (2005-10-07 16:31) [6]

OK! Спасибо за ответы! Все понял. Вообще то этого вопроса могло и не быть. Дело в том, что мне попался 256 цветный рисунок, исковерканный ACDSee. И это действительно так! У меня был 24-битный рисунок. Такого количества цветов ему было многовато (сосканированный простенький детский рисунок). Я его решил для экономии места перевести в 256 цетов в ACDSys. Ну, палитру поменял, там есть такая возможность. Места файл стал занимать действительно меньше, не спорю. А вот сделано было это скорее всего не корректно, поскольку при использовании в моей программе функции ScanLine, красный цвет, скажем, имел значение 0, белый =2 и т.д. Мне это показалось странным. Ведь при корректном рисунке это должны быть скорее всего числа 224 и 255. Поэтому и грешил на неправильное использование функции. Но поскольку вы меня убедили в правильности направления - попробовал другой рисунок и - опа - сработало! А тот, кривой рисунок потом открыл в простейшем mspaint, а он никаких других цветов, кроме RGB и B&W рисовать не хочет! Хочешь, скажем, фиолетовым чего нить нарисовать - рисует красным, желтым - не рисует вообще. Короче битый. Лечится переводом в 24-бит и потом в 256 цветный в том же mspaint. Вот такая вот шара.

ЗЫ
Особое спасибо за разъяснение о типе возвращаемых значений данной функцией для различной глубины цвета (8 бит, 24 бит и т.д.)


 
Antonn ©   (2005-10-07 17:00) [7]

SMATMP ©   (07.10.05 16:31) [6]
ACDSee что то с палитрой делает, сдвигает что ли. что бы качество было выше. например красный заменяет используемыми градациями зеленого. Вроде так.



Страницы: 1 вся ветка

Текущий архив: 2005.10.30;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.055 c
14-1128332022
TUser
2005-10-03 13:33
2005.10.30
Элита нашего общества,


14-1128709701
default
2005-10-07 22:28
2005.10.30
"Живое" пиво, срок хранения три дня


2-1128840523
Lumen
2005-10-09 10:48
2005.10.30
Установка компонентов


1-1128416177
stalker780
2005-10-04 12:56
2005.10.30
Клон компонента


1-1128684224
Viktop
2005-10-07 15:23
2005.10.30
Управление курсором