Форум: "Media";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];
ВнизПреобразовыние ч/б 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 вся ветка
Форум: "Media";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.049 c