Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Преобразовыние ч/б bmp изображения в массив... [D7, WinXP]


ilifant ©   (2005-12-23 15:26:00) 

Помогите пожалуйста как преобразовать ч/б bmp изображения в массив коэффициенты которого значения яркости пикселей


tester_one   (2006-01-10 01:34:00) [1]

>antonn
Насчёт скорости согласен.
Если используем Pixels[] - результат автоматом будет TColor, там всё в порядке с порядком цветов, в твоём случае (ScanLine) первым с структуре RGBTRIPLE идёт rgbtBlue, потом rgbtGreen, затем rgbtRed - т.е. переворачивать ничего не надо.


antonn   (2006-01-08 09:21:00) [2]

tester_one   (02.01.06 1:46) [9]
На всякий случай, как из R-G-B(24-битный файл!!!) получить яркость каждой точки:
var X:Longint;
...
X:=Integer(B.canvas.Pixels[i,j]) and $FFFFFF;
Coeff[i,j]:=Trunc((X and $0000FF)*0.3+((X and $00FF00) shr 08)*0.59+((X and $FF0000) shr 16)*0.11);

так по шустрее работать будет:

procedure FillMassiv(B:Tbitmap; var Coeff:TCoeff{ну или какой там тип...});
const Pixels = MaxInt div SizeOf(TRGBTriple);
type
 PRGBArray = ^TRGBArray;
 TRGBArray = array[0..Pixels-1] of TRGBTriple;
var x, y: Integer; RowOut: PRGBArray;
begin
 b.PixelFormat:=pf24bit;
 for y:=0 to B.Height-1 do begin
    RowOut:= B.ScanLine[y];
  for x:=0 to B.Width-1 do begin
      Coeff[y,x]:=trunc(RowOut[x].rgbtRed*0.3+RowOut[x].rgbtGreen*0.59+RowOut[x].rgbtBlue*0.11);
     //может нужно перевернуть R и B
  end;
 end;
end;


ilifant   (2006-01-08 02:54:00) [3]

СПАИБОtester_one!!!!   за разъяснение, в ближайшее время попробую, шас ботаю экзамены


tester_one   (2006-01-02 01:46:00) [4]

>ilifant
Ну как сказать....
Массив Coeff - это и есть массив нужных тебе коэффициентов, его размерность должна быть равной(или не менее) размеров изображения, ты его ж сам создаешь !!
Coeff[i,j] - соответствующий элемент данного  массива.
B.Canvas.Pixels[i,j] - элемент исходного изображения (пиксель), его результат -  формата TColor, потому нужно его привести к числу, что собственно Integer() и делает. Если файл изображения 256-цветный, то значащими будут лишь первые 8 бит от Integer(B.Canvas.Pixels[i,j]) // всё остальное на всякий случай отсекается этим самым "and 255" или "and $FF" (0xFF - это я ошибся).
Ты говорил про яркость, теперь говоришь про насыщеннось - непонятно.
На всякий случай, как из R-G-B(24-битный файл!!!) получить яркость каждой точки:
var X:Longint;
...
X:=Integer(B.canvas.Pixels[i,j]) and $FFFFFF;
Coeff[i,j]:=Trunc((X and $0000FF)*0.3+((X and $00FF00) shr 08)*0.59+((X and $FF0000) shr 16)*0.11);
...
в итоге в твоём Сoeff будут значения, которые будут соотвествовать яркостям исходного изображения. Почитай также про битовые операции и операторы, разберись как они действуют.
Удачи!!!


ilifant   (2005-12-30 17:16:00) [5]

Спасибо tester_one, отзовись т.к. я не понял что значит "Coeff[i,j]:=integer(B.Canvas.Pixels[i,j]) and 0xFF", это есть получение насыщенности , и для чего "and 0xFF"?огромное тебе человеческое спасибо если ответишь начинающему программистуздесь или на мыло.


tester_one   (2005-12-28 01:59:00) [6]

var Coeff:Array[1..ширина,1..длина] of Longint;
     i,j:longint;
B:=Bitmap.LoadFromFile('имяфайла');
if B.PixelFormat<>pf8Bit then Begin {error и всё такое} End else
for i:=1 to ширина
for j:=1 to длина do
begin
Coeff[i,j]:=integer(B.Canvas.Pixels[i,j]) and 0xFF;
{Это если изображение - 8 бит: нужны первые 8 бит - индекс палитры, в случае, если она(налитра) черно-белая и интенсивность в ней линейно возрастает от начала до самого конца - это и будет твоя интенсивность, иначе - смотри по этому  индексу текущее значение цвета и сам его оценивай. Если же изображение 24 бита, то бери либо 0-7 или 8-15, 16-23 - биты, они все по значению одни и те же.}
end;

end;


ilifant   (2005-12-26 12:39:00) [7]

Ответте кто-нибудь


ilifant   (2005-12-25 12:58:00) [8]

нашел сейчас на http://www.codenet.ru/progr/delphi/WinAPI/GetDIBits.phpописание GetBitmapBits или GetDiBits и насколоко я понял это не совсем то что мне надо, мне нужна функция которая возвращает массив коэффициенты которого значения яркости (не код цвета) пикселей т.е. результатом должен быть массив


ilifant   (2005-12-25 12:52:00) [9]

MBo я смотрел в справке делфи и таких процедур(или это функции) не нашел, может мне какой компонент установить надо, подскажите пожалуйста где его найти/скачать. делфи7 интерпрайс.буду бдагодарен если напишите правила записи этих процедур


ilifant   (2005-12-23 17:20:00) [10]

спасибо MBo попробую


MBo   (2005-12-23 16:12:00) [11]

GetBitmapBits или GetDiBits


Anatoly Podgoretsky   (2005-12-23 15:35:00) [12]

У черно белого изображение всего два коэффициента - черный и белый.


Наверх

Титульная страница Поиск, карта сайта Написать письмо