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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2008, 00:59   #1
yulia
Форумчанин
 
Аватар для yulia
 
Регистрация: 24.03.2007
Сообщений: 314
По умолчанию Оттенки серого

Здравствуйте..
Помогите, пожалуйста, что-то сделать с процедурой...
У меня есть процедура преобразования изображения в оттенки серого, которая выложена по всему интернету
Код:
function RgbToGray(RGBColor: TColor): TColor;
var
  Gray: byte;
begin
  Gray := Round((0.30 * GetRValue(RGBColor)) +
  (0.59 * GetGValue(RGBColor)) +
  (0.11 * GetBValue(RGBColor )));
  Result := RGB(Gray, Gray, Gray);
end;

procedure TForm1.N3Click(Sender: TObject);
var
  h, w: integer;
begin
  for w := 0 to Image1.Width-1 do
    for h := 0 to Image1.Height-1 do
      Image1.Canvas.Pixels[w, h] :=
      RgbToGray(Image1.Canvas.Pixels[w, h]);
end;
Все бы хорошо, но
1. Оно картинку размером с иконку преобразовывает минуту!!
2. Когда картинка большая, то оно преобразовывает только кусок

Можно ли как-то исправить скорость ее выполнения и почему только кусок?

Последний раз редактировалось rpy3uH; 03.12.2008 в 10:31.
yulia вне форума Ответить с цитированием
Старый 01.12.2008, 01:54   #2
Deight
Бредовый
Форумчанин
 
Аватар для Deight
 
Регистрация: 15.11.2008
Сообщений: 285
По умолчанию

Отрисовывай все на отдельном tbitmap а итог уже загружай в image.
Чем точнее и проще задан вопрос, тем проще на него получить точный ответ.
Deight вне форума Ответить с цитированием
Старый 01.12.2008, 09:11   #3
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Сколько не говори все бестолку... я вот не пойму я что не четко объясняю... ну или просто меня отказываются слушать ?

это так преамбула

Image1.Canvas.Pixels[w, h] :=
RgbToGray(Image1.Canvas.Pixels[w, h]); - это просто ужас... вы так будите вечность преобразовывать

есть два пути:
1. Старый для меня, и не очень функциональный для всех преобразовываем в Bitmap или вроде помниться функция зная HDC канвы получите массив битовых даных через GetDCDIBits вроде так (ну не помню все из MSDN) получаите данные потом зная их формат ну там 24 или 32 бита на пиксель юзаите TRGBQuard или TRGBTriple - в Windows.pas объявлены но юзаите как PRGBQuard и PRGBtriple - т.е. указатель...

2. Юзаем GDI+ создаем GpBitmap - грузит уйму форматов, потом получаем битовые данные в каком вам угодно формате и опять таки юзаем RGBQuard и т.п....

Далее в общем... вы перед вашими циклами указываите на ваши данные битовые например PRGBQuard := Bits ну вы поняли. и далее в цикле просто после обработки данного пикселя делаите инкремент вашей переменной inc(PRGBQuard) ну и в таком духе.... в таком случае можно сделать так же один цикл для скорости. просто умножив ширину на высоту и начинать с 1 to Width * Height. так кода будет меньше и скорость будет больше вы даже удивитесь как возростет скорость обработки.

p.s. по данной теме, всем советую переходить от String[Index] на PCHAR(String) + inc(PCHAR) + PCHAR^ - текущий символ, так же скорость будет намного больше чем через [Index]...
BOBAH13 вне форума Ответить с цитированием
Старый 01.12.2008, 09:52   #4
Nester
Форумчанин
 
Аватар для Nester
 
Регистрация: 22.10.2008
Сообщений: 103
По умолчанию

Когда-то делал так
Вложения
Тип файла: rar ColorToMono.rar (489.9 Кб, 39 просмотров)
Никто не знает больше чем не знаю я
Nester вне форума Ответить с цитированием
Старый 02.12.2008, 15:50   #5
yulia
Форумчанин
 
Аватар для yulia
 
Регистрация: 24.03.2007
Сообщений: 314
По умолчанию

Всем большое спасибо !!! )))
yulia вне форума Ответить с цитированием
Ответ


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