Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.04 c
15-1146522948
Сумчатое
2006-05-02 02:35
2006.06.04
Сколько весят песочные часы, когда песчек сыплется ?


1-1145898815
Kolan
2006-04-24 21:13
2006.06.04
Как передать массив записей используя технологию COM?


2-1147851226
Ironman83
2006-05-17 11:33
2006.06.04
DBNavigator


1-1145302715
Дмитрий_177
2006-04-17 23:38
2006.06.04
В Label обрезается текст при стиле Italic


15-1146924039
User_OKA
2006-05-06 18:00
2006.06.04
Коммутатор





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