Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.053 c
6-1120919399
Dust
2005-07-09 18:29
2005.10.30
TServerSocket и TClientSocket


14-1128423454
Андрей Жук
2005-10-04 14:57
2005.10.30
Турнир шахматистов


1-1128596503
Dysan
2005-10-06 15:01
2005.10.30
консоль для приложения


2-1128506267
alpine
2005-10-05 13:57
2005.10.30
Проблемма с SQL запросом.


2-1128819510
quadronik
2005-10-09 04:58
2005.10.30
Пример из дельфийского ХЕЛПа..не работает





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский