Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.04;
Скачать: CL | DM;

Вниз

Преобразовыние ч/б bmp изображения в массив...   Найти похожие ветки 

 
ilifant   (2005-12-23 15:26) [0]

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


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

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


 
MBo ©   (2005-12-23 16:12) [2]

GetBitmapBits или GetDiBits


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

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


 
ilifant   (2005-12-25 12:52) [4]

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


 
ilifant   (2005-12-25 12:58) [5]

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


 
ilifant   (2005-12-26 12:39) [6]

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


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

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-30 17:16) [8]

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


 
tester_one   (2006-01-02 01:46) [9]

>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   (2006-01-08 02:54) [10]

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


 
antonn ©   (2006-01-08 09:21) [11]

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;


 
tester_one   (2006-01-10 01:34) [12]

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



Страницы: 1 вся ветка

Текущий архив: 2006.06.04;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.039 c
15-1146945640
GanibalLector
2006-05-07 00:00
2006.06.04
Кто помнит pascal...


2-1147957566
Alien1769
2006-05-18 17:06
2006.06.04
Поиск словосочетания в полях


15-1146824709
iamdanil
2006-05-05 14:25
2006.06.04
Пополнение кошелька с мобильного телефона


2-1147709537
Staaaas
2006-05-15 20:12
2006.06.04
Программа по поиску текстовых файлов!


3-1144929416
ttt_111
2006-04-13 15:56
2006.06.04
Как сделать поиск в DBgrid?