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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2010, 19:43   #1
fen1ksss
Пользователь
 
Регистрация: 29.11.2009
Сообщений: 44
По умолчанию Тип переменной

Есть юнит, не могу понять каким типом описать переменную filter, подскажите

for m:=1 to strtoint(Combobox1.text) do begin
for k:=1 to strtoint(Combobox1.text) do begin
filter[k,m]:=bmp_source.Canvas.Pixels[j+k-1,i+m-1];

bmp_source типа TBitmap;
fen1ksss вне форума Ответить с цитированием
Старый 21.12.2010, 20:42   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Никто не расстреляет, если указанную переменную описать двухмерным массивом.
Код:
var Filter : array of array of Integer;
...
  SetLength(Filter, m);
  for I := 0 to High(Filter) do
    SetLength(Filter[I], k);
Здесь, правда, нужно не m и k использовать, а значение, которое возвращает strtoint(Combobox1.text)

Последний раз редактировалось Прик; 22.12.2010 в 00:23. Причина: Исправление
Прик вне форума Ответить с цитированием
Старый 21.12.2010, 22:06   #3
fen1ksss
Пользователь
 
Регистрация: 29.11.2009
Сообщений: 44
По умолчанию

Цитата:
Сообщение от Прик Посмотреть сообщение
Никто не расстреляет, если указанную переменную описать двухмерным массивом.
Код:
var Filter : array of array of Integer;
...
  SetLength(Filter, m);
  for I := 0 to High(Filter) do
    SetLength(Filter[I], k);
уже пробовал, не то, хотелось бы именно без изменения текста
fen1ksss вне форума Ответить с цитированием
Старый 21.12.2010, 23:10   #4
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

О чем человек вопрошает:
Цитата:
Сообщение от fen1ksss Посмотреть сообщение
не могу понять каким типом описать переменную filter, подскажите
И кто (что) за злодей, который не дает описать переменную?
И что это за текст такой, который не хотелось бы менять (Библии, "Капитала", "биля о правах")? Нельзя ли конкретнее?
Код:
filter[k,m]:=bmp_source.Canvas.Pixels[j+k-1,i+m-1];
Какой здесь может быть тип кроме двухмерного массива? Сама строка кода вопиет о типе.

Последний раз редактировалось Прик; 21.12.2010 в 23:13.
Прик вне форума Ответить с цитированием
Старый 21.12.2010, 23:13   #5
fen1ksss
Пользователь
 
Регистрация: 29.11.2009
Сообщений: 44
По умолчанию

Цитата:
Сообщение от Прик Посмотреть сообщение
О чем человек вопрошает:
И кто (что) за злодей, который не дает описать переменную?
злой злодей

есть фильтр эффекта размытия изображения


Код:
procedure TForm_Filter.BitBtn2Click(Sender: TObject);
var
  i,j:Longint;//счетчики циклов для обхода каждого пикселя
  m,k:Byte;//счетчики
  bmp_source,bmp_dest:TBitmap;//хранят исходное и обработанные изображения
  r,g,b:Longint;//составляющие цвета
begin
   // Перезаписать буфер отката
  Undo_Buffer.Width:=Form_Picture[Current_form].Image_pic.Picture.Bitmap.Width;
  Undo_Buffer.Height:=Form_Picture[Current_form].Image_pic.Picture.Bitmap.Height;
  Undo_Buffer.Canvas.CopyRect(Rect(0,0,Undo_Buffer.Width,Undo_Buffer.Height),
  Form_Picture[Current_form].Image_pic.Canvas, Rect(0,0,Undo_Buffer.Width,Undo_Buffer.Height));
  //создаем переменные для хранения изображений
  bmp_source:=TBitmap.Create;//будет хранить исходное изображение
  bmp_dest:=TBitmap.Create;//хранит обработанное изображение
  //устанавливаем размеры переменных буферов в соответствии с размерами
  //обрабатываемого изображение
  bmp_source.Width:=Form_Picture[Current_form].Image_pic.Width;
  bmp_source.Height:=Form_Picture[Current_form].Image_pic.Height;
  bmp_dest.Width:=Form_Picture[Current_form].Image_pic.Width;
  bmp_dest.Height:=Form_Picture[Current_form].Image_pic.Height;
  //загружаем изображение
  bmp_source.Assign(Form_Picture[Current_form].Image_pic.Picture);
  bmp_dest.Assign(Form_Picture[Current_form].Image_pic.Picture);
  //циклы по всем пикселям исходного изображения
  for i:=0 to bmp_source.Height-strtoint(Combobox1.text) do begin
    for j:=0 to bmp_source.Width-strtoint(Combobox1.text) do begin
     //заполняем массив фильтра
      for m:=1 to strtoint(Combobox1.text) do begin
        for k:=1 to strtoint(Combobox1.text) do begin
          filter[k,m]:=bmp_source.Canvas.Pixels[j+k-1,i+m-1];
        end;
      end;
  k:=strtoint(Combobox1.text);//получаем размер фильтра
  //обнуляем переменные, хранящие составляющие цвета
  r:=0;
  g:=0;
  b:=0;
  //формируем сумму как сумму элементов на диагоналях массива фильтра
  for m:=1 to strtoint(Combobox1.text) do begin
     //выбираем пиксели с главной диагонали
     r:=r+getrvalue(filter[m,m]);//извлекаем код красной составляющей цвета
     g:=g+getgvalue(filter[m,m]);//извлекаем код зеленой составляющей цвета
     b:=b+getbvalue(filter[m,m]);//извлекаем код синей составляющей цвета
     //выбираем элементы с побочной диагонали
     r:=r+getrvalue(filter[k,k]);
     g:=g+getgvalue(filter[k,k]);
     b:=b+getbvalue(filter[k,k]);
     dec(k); //уменьшаем K на единицу
  end;
  //ceil-наибольшее целое от деления
  //среднее значение для кода красной составляющей
  r:=ceil(r/(2*strtoint(Combobox1.text)));
  //среднее значение для кода зеленой составляющей
  g:=ceil(g/(2*strtoint(Combobox1.text)));
  //среднее значение для кода синей составляющей
  b:=ceil(b/(2*strtoint(Combobox1.text)));
  //обновляем изображение
  //rgb(красная_сост-я,зеленая_сост-я,синия сост-я)-формирует RGB цвет из
  //составляющих,указанных в параметрах
  bmp_dest.Canvas.Pixels[j+ceil(strtoint(Combobox1.text)/2),i+ceil(strtoint(Combobox1.text)/2)]:=rgb(r,g,b);
    end;
   end;
   //заменяем исходное изображение обработанным
  Form_Picture[Current_form].Image_pic.Picture.Assign(bmp_dest);
  //уничтожаем переменные буферы
  bmp_source.Destroy;
  bmp_dest.Destroy;
  Form_Filter.Close;
end;


end.
не знаю как описать переменную filter
fen1ksss вне форума Ответить с цитированием
Старый 21.12.2010, 23:24   #6
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

В тексте переменная filter - массив, содержащий цвет точек изображения (TColor).
Массив можно объявить:
Код:
var Filter : array of array of Integer;
или
var Filter : array of array of TColor;
без разницы.
Все равно пока не понятно в чем проблема.
Прик вне форума Ответить с цитированием
Старый 21.12.2010, 23:53   #7
fen1ksss
Пользователь
 
Регистрация: 29.11.2009
Сообщений: 44
По умолчанию

Цитата:
Сообщение от Прик Посмотреть сообщение
В тексте переменная filter - массив, содержащий цвет точек изображения (TColor).
Массив можно объявить:
Код:
var Filter : array of array of Integer;
или
var Filter : array of array of TColor;
без разницы.
Все равно пока не понятно в чем проблема.
что array of array of TColor, array of array of Integer выдает ошибку при применении эффекта на изображении:

First chance exception at $7C812AEB. Exception class EAccessViolation with message 'Access violation at address 0046D340 in module 'Project1.exe'. Read of address 00000004'. Process Project1.exe (4192)
fen1ksss вне форума Ответить с цитированием
Старый 22.12.2010, 00:05   #8
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

А полная уверенность в том что именно такое (такие) объявление переменной filter дает ошибку есть?
Может быть надо не только объявлять массив, но и разместить в памяти его элементы (относится к динамическим массивам)?
В посте #3 показано как это делается.
Похожие ошибки появляются именно тогда, когда массив объявлен, но происходит обращение к несуществующим его элементам.

Последний раз редактировалось Прик; 22.12.2010 в 00:17. Причина: уточнение
Прик вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Узнать тип переменной MAcK Паскаль, Turbo Pascal, PascalABC.NET 8 19.12.2012 13:25
Проверить тип переменной satana Общие вопросы Delphi 10 20.11.2010 21:43
Тип переменной Recordset Insightful Microsoft Office Access 6 23.04.2010 15:10
Тип переменной после Destroy Ser@Fim Компоненты Delphi 1 07.03.2010 15:59
Тип переменной KoBRaAndrey Общие вопросы Delphi 2 06.10.2009 00:11