Форум: "Начинающим";
Текущий архив: 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