![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Преобразовыние ч/б 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]У черно белого изображение всего два коэффициента - черный и белый.