Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.015 c
14-82482
TMaster
2003-09-05 22:36
2003.09.25
Вопрос по форуму


1-82310
bug008
2003-09-10 12:29
2003.09.25
различия Delphi 7, 6, 5


1-82261
r00t
2003-09-14 21:23
2003.09.25
Как создать красивую кнопку?


1-82179
fender
2003-09-12 14:29
2003.09.25
Активность


1-82280
Dark Elf
2003-09-15 15:10
2003.09.25
Копирование файлов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский