Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.01.2010, 15:56   #21
Herly
Форумчанин
 
Регистрация: 07.11.2009
Сообщений: 118
По умолчанию

Цитата:
Сообщение от ОДИНОЧЕСТВО В СЕТИ Посмотреть сообщение
pf24bit- это изображение использует 3 байта на пиксель
То есть в одном пикселе содержится 3 цвета?
Если всё откладывать на потом, то потом будет всё.
Herly вне форума Ответить с цитированием
Старый 05.01.2010, 15:58   #22
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Если для Вас это - новость, то да. Любой цвет получается смешением в определенных пропорциях 3-х основных цветов - R[ed]+G[reen]+B[lue]. Цвет занимает по байту, следовательно - 24 бита.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 05.01.2010, 16:13   #23
Herly
Форумчанин
 
Регистрация: 07.11.2009
Сообщений: 118
По умолчанию

1)
Цитата:
_B_out.PixelFormat:=pf24bit; //убрать, если изначально этот формат
А как определить какой у меня формат?
2)
Цитата:
for y:=0 to _B_out.Height-1 do begin
RowOut:= _B_out.ScanLine[y];
for x:=0 to _B_out.Width-1 do begin _s:=trunc((RowOut[x].rgbtRed+RowOut[x].rgbtGreen+RowOut[x].rgbtBlue)/3);
if _s>255 then _s:=255; if _s<0 then _s:=0;
RowOut[x].rgbtRed:=_s;
RowOut[x].rgbtGreen:=_s;
RowOut[x].rgbtBlue:=_s;
end;
Помогите понять что происходит в этом коде.
Т.к. эта процедура превращает картинку в чёрно белую здесь идёт смена цветного пикселя на аналогичный по оттенку серый пиксель.
А как зависит цвет от цифры?
Например переменная _s имеет тип integer, значит RowOut[x].rgbTRed это номер оттенка красного и так далее? Сколько всего оттенков и какова их тональность?
Если всё откладывать на потом, то потом будет всё.
Herly вне форума Ответить с цитированием
Старый 05.01.2010, 16:21   #24
ОДИНОЧЕСТВО В СЕТИ
Любопытная Вредина
Участник клуба
 
Аватар для ОДИНОЧЕСТВО В СЕТИ
 
Регистрация: 19.06.2009
Сообщений: 1,285
По умолчанию

Цитата:
Сколько всего оттенков
16777216
подробнее
Может пора уже самому как-нибудь у Google поспрашивать
Дурь - это особая форма материи, которая не возникает ниоткуда и не исчезает никуда, а лишь переходит из одной головы в другую.
ОДИНОЧЕСТВО В СЕТИ вне форума Ответить с цитированием
Старый 05.01.2010, 16:24   #25
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Что есть серый пиксель? Серый пиксель, это когда все 3 составляющие равны между собой. Цветной пиксель - когда НЕ равны.
Пример:
R=255 G=0 B=0 - Красный пиксель
R=34 G=34 B=34 - Серый пиксель

В данном коде серый пиксель получают так: складывают все три составляющие:
Код:
(RowOut[x].rgbtRed+RowOut[x].rgbtGreen+RowOut[x].rgbtBlue
И делят на 3:
Код:
/3
Далее проверка на вылет за пределы цветовой гаммы:
Код:
if _s>255 then _s:=255; if _s<0 then _s:=0;
И присваиваем цветовые каналы обратно:
Код:
RowOut[x].rgbtRed:=_s;
RowOut[x].rgbtGreen:=_s;
RowOut[x].rgbtBlue:=_s;
Теперь это серое изображение.

Цитата:
А как определить какой у меня формат?
Если грузите изображение из TImage, то у вас pf32bit, потому, что TImage использует 4 байта на цвет. Если грузите с битмапа, у которого 24-битный формат, то у вас pf24bit.

А вообще читать ЗДЕСЬ.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 05.01.2010, 16:44   #26
Herly
Форумчанин
 
Регистрация: 07.11.2009
Сообщений: 118
По умолчанию

Цитата:
Сообщение от ОДИНОЧЕСТВО В СЕТИ Посмотреть сообщение
16777216
Может пора уже самому как-нибудь у Google поспрашивать
Я вчера у него поспрашивал, на что он выдавал однообразные сайты в которых инфы для тех кто пытается понять что-то с азов совсем немного было
Последние 2 вопроса, потому что вижу что уже надоел и потому что это последнее что мне не хватает для самостоятельного продвижения.
1) В главной проге вызывается процедура где _B_:TBitmap присваевается Image3.Picture.Bitmap
дальше выполняется процедура в которой я с вашей помощью немного разобрался, а после завершения сразу идёт image3.Repaint;
Так вот где идёт обратное добавление изменённого RowOut в _B_???
Цитата:
var x, y: Integer; RowOut: PRGBArray;
_s:integer;
begin
_B_out.PixelFormat:=pf24bit; //убрать, если изначально этот формат
for y:=0 to _B_out.Height-1 do begin
RowOut:= _B_out.ScanLine[y];
for x:=0 to _B_out.Width-1 do begin
_s:=trunc((RowOut[x].rgbtRed+RowOut[x].rgbtGreen+RowOut[x].rgbtBlue)/3);
if _s>255 then _s:=255; if _s<0 then _s:=0;
RowOut[x].rgbtRed:=_s;
RowOut[x].rgbtGreen:=_s;
RowOut[x].rgbtBlue:=_s;
end;
end
end;
2) Какие значения R,G,B должны быть чтобы пиксель был совершенно чёрным?(все 255 ?)
Если всё откладывать на потом, то потом будет всё.

Последний раз редактировалось Herly; 05.01.2010 в 16:53.
Herly вне форума Ответить с цитированием
Старый 05.01.2010, 16:58   #27
ОДИНОЧЕСТВО В СЕТИ
Любопытная Вредина
Участник клуба
 
Аватар для ОДИНОЧЕСТВО В СЕТИ
 
Регистрация: 19.06.2009
Сообщений: 1,285
По умолчанию

Цитата:
Какие значения R,G,B должны быть чтобы пиксель был совершенно чёрным?
все 0 10символов
Дурь - это особая форма материи, которая не возникает ниоткуда и не исчезает никуда, а лишь переходит из одной головы в другую.
ОДИНОЧЕСТВО В СЕТИ вне форума Ответить с цитированием
Старый 05.01.2010, 17:31   #28
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Так вот где идёт обратное добавление изменённого RowOut в _B_???
Везде.
Дело в том что
Код:
property ScanLine[Row: Integer]: Pointer read GetScanLine;
ScanLine возвращяет указатель, следовательно после
Код:
RowOut:= _B_out.ScanLine[y];
любое обращение к элементам массива RowOut^ будет эквивалентно обращению к пикселам строки самого _B_out, до тех пор пока сам указатель RowOut не будет переопределен.
Sibedir вне форума Ответить с цитированием
Старый 05.01.2010, 17:39   #29
Herly
Форумчанин
 
Регистрация: 07.11.2009
Сообщений: 118
По умолчанию

Теперь почти всё ясно, всем спасибо за помощь!
А прокоментируйтe ещё пожалуйста вот это
Цитата:
const
Pixels = MaxInt div SizeOf(TRGBTriple);
type
PRGBArray = ^TRGBArray;//зачем вот эта втрочка?
TRGBArray = array[0..Pixels-1] of TRGBTriple;
Как получается занчение Pixels? И что такое Triple?
Если всё откладывать на потом, то потом будет всё.

Последний раз редактировалось Herly; 05.01.2010 в 17:44.
Herly вне форума Ответить с цитированием
Старый 06.01.2010, 04:08   #30
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
Лампочка

Так... Много тут без меня написали уже.....
Попробую объяснить всё попонятнее...

Хотя Alex Cones уже практически всё объяснил... Вот только можно и не создавать класс, а обойтись присваиванием к уже существующему объекту (как и есть в первом посте), но это надо понимать что в таком случае получается...
Цитата:
Вот этим кодом можно загрузить картинку в Bitmap(как я понял это массив пикселей и их цветов).
Нет... TBitmap - это класс (грубо говоря много переменных, процедур и функций в одном флаконе)... Обёртка VCL, сделанная для удобства... ^__^
Но вы не "загружаете" картинку, а как бы делаете двойника... То есть у вас получалось, что Mbm и Image1.Picture.Bitmap - это одно и то же, а не копия (думаю так понятнее будет)...
Цитата:
Знаю что у TBitmap есть свойство ScanLine, которое возвращает линию пикселей из Bitmap.
Лучше рассматривать ScanLine как функцию, возвращающую указатель на начало заданной строки массива пикселей в памяти... %)
Цитата:
И можно ли присваивать картинку в битмап вот так?
Код:
Mbm:=Pimg1.Picture.Bitmap;
Вообще возможно (иначе бы Делфи ошибки выдавала), но тогда получается двойник... Если нужно копировать изображение - то именно как сказал Alex Cones:
Код:
Mbm.Assign(Pimg1.Picture.Bitmap);
А вот тут:
Цитата:
А вот пишу как вы сказали и выдаёт ошибочку(
...
у вас довольно распространённая опечатка... Бывает...
Цитата:
В процедуре задаётся вот такой формат, объясните что даёт такой формат.
Это как бы специальные константы для TBitmap, показывающие качество изображения (количество цветов)...
Основные:
pf32bit - True Color + Alpha Channel (изображение с полупрозрачностью)
pf24bit - True Color
pf8bit - 256 Colors
pf4bit - 16 Colors
pf1bit - 2 Colors
Цитата:
А как определить какой у меня формат?
Ну вот как-то так можно:
Код:
var Mbm: TBitmap;

...

Mbm:=TBitmap.Create;

...

Case Mbm.PixelFormat Of
      pf1bit:
            ShowMessage('PixelFormat is <pf1bit>');
      pf4bit:
            ShowMessage('PixelFormat is <pf4bit>');
      pf8bit:
            ShowMessage('PixelFormat is <pf8bit>');
      pf24bit:
            ShowMessage('PixelFormat is <pf24bit>');
      pf32bit:
            ShowMessage('PixelFormat is <pf32bit>');
      End;

...

Mbm.Free;
Цитата:
То есть в одном пикселе содержится 3 цвета?
Эм... В одном пикселе почти всегда 3 цвета - RGB, но там имеется ввиду другое: столько памяти занимает каждый пиксель (в битах)...
Цитата:
Если грузите изображение из TImage, то у вас pf32bit, потому, что TImage использует 4 байта на цвет. Если грузите с битмапа, у которого 24-битный формат, то у вас pf24bit.
Хм... TImage вроде подстраивается под загруженный файл...
Цитата:
любое обращение к элементам массива RowOut^ будет эквивалентно обращению к пикселам строки самого _B_out
Проще говоря - это получается прямой доступ к пикселю в памяти через указатель...

Цитата:
Теперь почти всё ясно, всем спасибо за помощь!
А прокоментируйтe ещё пожалуйста вот это
А фиг знает, что они там выдумали... У каждого свой способ, как что делать...
TRGBTriple вроде тип данных из модуля Windows.pas...

Я по-своему делал... Вот тут мой пример: > Ссыль < (правда там показано только с pf24bit)

I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с TBitmap QunneD Общие вопросы Delphi 2 21.11.2009 18:32
ImageList + TBitMap = ... Alex Cones Мультимедиа в Delphi 4 08.07.2009 14:00
TBitmap и указатели Levsha100 Общие вопросы C/C++ 3 17.05.2009 22:36
движение TBitMap Juffin Мультимедиа в Delphi 1 14.04.2009 21:34
TBitmap odi_noki Мультимедиа в Delphi 17 25.10.2008 09:53