Форум: "Media";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];
ВнизБыстрая графика: как считать/задать цвет в виде TColor? Найти похожие ветки
← →
Vlad2 (2003-05-26 21:18) [0]Имеется в виду использование таких свойств TBitmap, как ScanLine и PixelFormat.
Опытные товарищи справедливо посоветовали посмотреть FAQ. Действительно, я там нашёл нужный пример:
http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988625229&n=21
Вот кусочек примера:
begin
p:=b.scanline[y];
for x:=0 to b.width-1 do
begin
p[x].r:=random(256);
p[x].g:=random(256);
p[x].b:=random(256);
( и потом изменить) Имеется в виду использование таких свойств TBitmap, как ScanLine и PixelFormat.
Опытные товарищи справедливо посоветовали посмотреть FAQ. Действительно, я там нашёл нужный пример:
http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988625229&n=21
Вот кусочек примера:
begin
p:=b.scanline[y];
for x:=0 to b.width-1 do
begin
p[x].r:=random(256);
p[x].g:=random(256);
p[x].b:=random(256);
end;
end
Вопрос: как узнать (и потом изменить) цвет конкретного пиксела как объекта TColor? Т.е. чтобы переменная р в примере была типа TColor. Т.е. мне нужен быстрый аналог свойства Pixels класса TCanvas.
К сожалению, не мог найти ответ у коллег и знакомых, поэтому вынужден отнимать время уважаемых знатоков Дельфи. (Вообще-то, программирую в С++Builder, но в данном случае это не имеет значения).
Буду благодарен за помощь.
← →
Плохой человек (2003-05-26 22:08) [1]http://www.efg2.com/Lab/ImageProcessing/Scanline.htm
Посмотри, там всё о Scanline и о конвертации TColor в RGB.
← →
Vlad2 (2003-05-27 08:14) [2]Cпасибо за ответ. Материал там большой, к сожалению, на английском.
Наверняка кто-то сталкивался с такой проблемой и может подсказать 2-3 оператора, чтобы сразу получить в p[x] объект типа TColor.
← →
MBo (2003-05-27 08:48) [3]ColorVar:=RGB(p[x].r,p[x].g,p[x].b);
← →
Vlad2 (2003-05-27 11:00) [4]Большое спасибо уважаемым Плохому (я так думаю, наоборот :)) человеку и MBo за помощь. Получилось, как хотел.
Но пожалуйста, объясните роль PixelFormat. От чего зависит его значение и как программно узнать, каким оно должно быть?
← →
jel (2003-05-27 16:48) [5]PixelFormat это формат хранения информации о цвете точки.
при 32 битном цвете точка занимает 4 байта (R G B Alpha)
при однобитном цвете - 1 бит. А вот как узнать каким оно должно быть - уточни что именно ты хочешь сделать?
← →
Плохой человек (2003-05-27 19:57) [6]Почитай ещё тут:
http://www.hot.ee/mvps3/scanline.zip
Там перевод той статьи на русский язык.
Ну а если коротко, то PixelFormat определяет, в каком формате будут возвращены данные о строке пикселей. И для каждого значения этот формат разный, в этом всё и муторство.
← →
Vlad2 (2003-05-28 18:33) [7]Спасибо, jel и Плохой человек.
Когда я задал PixelFormat := pf24bit, все цвета определились правильно и область покрасилась правильно (нужного размера и в нужный цвет). Когда стал экспериментировать с другими значениями PixelFormat, всё получалось неправильно (не тот цвет, закрашивался меньший или больший размер области).
Мой вопрос. Каким задавать значение PixelFormat, чтобы моё приложение правильно работала на разных компах, с разными ОС (Win-98, -XP, -NT, -2000)? Т.е. зависит ли PixelFormat от настройки (параметров) ОС? Если зависит, то как узнать программно (в runtime), какое значение PixelFormat нужно присвоить?
Буду благодарен за конкретный ответ. Спасибо, ребята.
← →
Плохой человек (2003-05-28 19:56) [8]Ну если ты задаёшь формат, то от ОС изображение будет независимо, по крайней мере pf24bit и выше. А как узнать - это просто. Создай изображение и определи его PixelFormat, который был задан по-умолчанию.
← →
Vlad2 (2003-05-28 22:07) [9]>> Создай изображение и определи его PixelFormat, который был задан по-умолчанию
Когда я создал картинку (типа TBitmap), то по умолчанию PixelFormat там оказался pfDevice, а не pf24bit. Так что это, кажется, не показатель. И роль PixelFormat мне непонятна, если от ОС не зависит. Может, зависит от параметров настройки ОС (в "Свойствах экрана")?
← →
Плохой человек (2003-05-28 22:24) [10]>И роль PixelFormat мне непонятна, если от ОС не зависит.
Но ведь одно дело создать изображение в памяти и работать с ним, а другое дело - загружать изображение. Если ты загружаешь 8-битное изображение, то с ним тебе придётся и работать.
← →
Vlad2 (2003-05-28 23:01) [11]То есть, если не загружаешь, а создаёшь изображение в памяти (именно это я и делаю), то PixelFormat значение не имеет? Но тогда почему правильное отображение получается только при pf24bit?
← →
Плохой человек (2003-05-28 23:23) [12]> То есть, если не загружаешь, а создаёшь изображение в памяти (именно это я и делаю), то PixelFormat значение не имеет? Но тогда почему правильное отображение получается только при pf24bit?
Вот тут то и проявляется зависимость от ОС, а точнее от устройства. Ты получаешь Device Dependent Bitmap, ты не можешь точно сказать, какой у него формат. Поэтому надо присвоить PixelFormat какое-либо конкретное значение изображения дабы не зависело от устройства.
← →
Vlad2 (2003-05-29 09:58) [13]>> Поэтому надо присвоить PixelFormat какое-либо конкретное значение изображения дабы не зависело от устройства
А почему правильно работает только с pf24bit?
Конкретно, что мне надо написить в программе (определить PixelFormat), чтобы моё приложение правильно работало в других ОС (устройствах)? Или значение pf24bit - универсально?
← →
Плохой человек (2003-05-29 12:57) [14]> А почему правильно работает только с pf24bit?
Ты напиши, как ты пытался работать с остальными форматами. А значение pf24bit универсально в том смысле, что может отобразить на себе рисунок любого другого PixelFormat (даже pf32bit, т.к. альфа-изображение пока ещё нераспространено). Используй его и получишь одинаковое изображение во всех осях.
← →
Vlad2 (2003-05-29 23:10) [15]>> Ты напиши, как ты пытался работать с остальными форматами
Просто заливаю область типа, например:
begin
p:=b.scanline[y];
for x:=0 to b.width-1 do
begin
p[x].r:=255
p[x].g:=0;
p[x].b:=0;
end;
end
меняю только PixelFormat, и сплошной красный цвет на всём Bitmap"е получаю только при pf24bit. При других значениях PixelFormat всегда получается неправильно.
>> А значение pf24bit универсально ...
Наверное, это действительно так. Правда, тогда не понятно, зачем нужны другие значения PixelFormat.
Спасибо большое за ценные советы, и особенно за желание помочь.
← →
Плохой человек (2003-05-30 00:11) [16]Вот в этом всё и дело. Разберём формат pf42bit. В твоём примере переменная p должна быть типа pRGBTripleArray, т.е. массив (точнее, ссылка, но это не суть), элемент которого имеет тип TRGBTriple. Эта запись описана в Delphi так:
pRGBTriple = ^TRGBTriple;
TRGBTriple =
PACKED RECORD
rgbtBlue : BYTE;
rgbtGreen: BYTE;
rgbtRed : BYTE;
END;
Как видишь, ты можешь присвоить значения красному, зелёному и синему цветам от 0 до 255. Это pf24bit, 24-битное изображение, каждый пиксель которого может принимать одно значение из 16.7 миллионов.
Теперь разберём pf1bit. Одна ScanLine-строка для этого формата должна иметь тип pByteArray (это стандартные названия), т.е. массив элементов типа Byte. А байт, как известно, имеет два значения, для нашего изображения - это чёрный и белый. Ты же в своём коде пытаешься присвоить (например, своим кодом) определённые значения изображению такого формата, который может отображать всего 2 цвета.
← →
jel (2003-05-30 09:28) [17]
> А байт, как известно, имеет два значения
Речь видимо идет о бите
← →
Vlad2 (2003-05-30 09:36) [18]Спасибо, уважаемый Плохой человек. Примерно понятно.
И последнее (прошу прощения за, возможно, глупый вопрос): есть ли связь между значением PixelFormat и параметром качества цветопередачи в Свойствах экрана? Например, у меня стоит "Самое высокое (32 бита)", и я наивно думал, что PixelFormat нужно задать pf32bit.
← →
Плохой человек (2003-05-30 22:21) [19]>Речь видимо идет о бите
Аюсолютно точно, меня сбило название типа.
>есть ли связь между значением PixelFormat и параметром качества цветопередачи в Свойствах экрана? Например, у меня стоит "Самое высокое (32 бита)", и я наивно думал, что PixelFormat нужно задать pf32bit.
Нет, связи нет. Ты даже моешь загрузить 24-битное изображение при количестве цветов 16-bit, и изображение у тебя загрузится, будет отображено в 16-bit, но ошибки не будет.
Вообще, у меня тоже стоит 32-bit, хотя 32- и 24-bit сейчас идентичны, т.е. в 32-bit 3*8 бит заняты под RGB и один байт (8 бит) под что угодно, обычно под альфа-маску, но пока ещё это дело не распространено.
← →
Vlad2 (2003-06-02 10:29) [20]Спасибо за конструктивный ответ, он мне понятен.
Я не знаю, что такое альфа-маска, но наверное, это дело будущего.
Большое спасибо за помощь!
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.012 c