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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2014, 13:04   #1
zzdxw
Пользователь
 
Регистрация: 05.10.2014
Сообщений: 24
По умолчанию Статические и динамические двумерные массивы

Всем привет.
Помогите перевести статические двумерные массивы в динамические двумерные в представленном коде. Когда я меняю их самостоятельно перестают работать либо функция открытия изображения, либо функция Sobel.
Заранее, спасибо!
Код:
const
  r_true=1;
  r_false=0;
  maxImageWidth = 2000;
  maxImageHeight = 2000;

type
  TRGB=record
    r,g,b:byte;
  end;

  ARGB=array [0..1] of TRGB;
  PARGB=^ARGB;

var
  Form1: TForm1;
  a:array[0..maxImageWidth,0..maxImageHeight] of byte;
  gx,gy,mr4:array[0..maxImageWidth,0..maxImageHeight] of double;
  BMPHeight,BMPWidth:integer;
  pixeldeleted:boolean;

implementation

{$R *.dfm}

procedure Sobel;
var
  i,j:integer;
begin
  for i:=1 to BMPWidth-1 do
    for j:=1 to BMPHeight-1 do
    begin
      gx[i,j]:=(a[i-1,j+1]+2*a[i,j+1]+a[i+1,j+1])-(a[i-1,j-1]+2*a[i,j-1]+a[i+1,j-1]);
      gy[i,j]:=(a[i+1,j-1]+2*a[i+1,j]+a[i+1,j+1])-(a[i-1,j-1]+2*a[i-1,j]+a[i-1,j+1]);
    end;
end;


procedure TForm1.N3Click(Sender: TObject);
begin
  if SavePictureDialog1.Execute then
  begin
    image1.Picture.SaveToFile(SavePictureDialog1.FileName);
  end;
end;

procedure TForm1.N2Click(Sender: TObject);
begin
  if OpenPictureDialog1.Execute then
  begin
    image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
    LoadInArray;
  end;
end;

procedure TForm1.N5Click(Sender: TObject);
var
  x,y:integer;
  val:integer;
  Ln:PARGB;
begin
  if (image1.Picture.Width>maxImageWidth) or (image1.Picture.Height>maxImageHeight) then
  begin
    ShowMessage('Изображение слишком большое!');
    exit;
  end;

  Sobel;

  for y:=1 to BMPHeight-1 do
  begin
    Ln:=form1.image1.Picture.Bitmap.scanline[y];
    for x:=1 to BMPWidth-1 do
    begin
      val:= round(sqrt(sqr(gx[x,y])+sqr(gy[x,y])));
      if val>255 then
        val:=255;
      Ln[x].b:=val;
      Ln[x].g:=val;
      Ln[x].r:=val;
    end;
  end;
  form1.Image1.Repaint;
end;

procedure TForm1.LoadInArray;
var
  Ln:PARGB;
  x,y:integer;
begin
  if image1.Picture.Bitmap.PixelFormat<>pf24bit then
    image1.Picture.Bitmap.PixelFormat:=pf24bit;

  BMPHeight:=image1.Picture.height;
  BMPWidth:=image1.Picture.width;
  for y := 0 to BMPHeight-1 do
  begin
    Ln := form1.image1.Picture.Bitmap.scanline[y];
    for x := 0 to BMPWidth-1 do
    begin
      a[x,y]:=(Ln[x].r+Ln[x].g+Ln[x].b) div 3;
    end;
   end;

end;
zzdxw вне форума Ответить с цитированием
Старый 25.10.2014, 13:56   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А как менял покажешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.10.2014, 14:10   #3
zzdxw
Пользователь
 
Регистрация: 05.10.2014
Сообщений: 24
По умолчанию

Например, массив a.
var
Form1: TForm1;
a:array of array of byte;
...

procedure TForm1.LoadInArray;
var
Ln:PARGB;
x,y:integer;
begin
if image1.Picture.Bitmap.PixelFormat<> pf24bit then
image1.Picture.Bitmap.PixelFormat:= pf24bit;

BMPHeight:=image1.Picture.height;
BMPWidth:=image1.Picture.width;
SetLength(a, BMPWidth, BMPHeight)
for y := 0 to BMPHeight-1 do
begin
Ln := form1.image1.Picture.Bitmap.scanlin e[y];
for x := 0 to BMPWidth-1 do
begin
a[x,y]:=(Ln[x].r+Ln[x].g+Ln[x].b) div 3;
a:=nil;
end;
end;

Ругается на строчку с формулой gx[i,j]:=(a[i-1,j+1]+2*a[i,j+1]+a[i+1,j+1])-(a[i-1,j-1]+2*a[i,j-1]+a[i+1,j-1]);
zzdxw вне форума Ответить с цитированием
Старый 25.10.2014, 15:07   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Мдя... Ладно уточню:
1) И где эта строчка?
2) И где текст ошибки?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.10.2014, 15:35   #5
zzdxw
Пользователь
 
Регистрация: 05.10.2014
Сообщений: 24
По умолчанию

Строчка в другой процедуре. В Sobel.
Ошибка после попытки применить фильтр Sobel.
Запускается программа. Открываю BMP (к слову, открывается секунд 15), пытаюсь применить данный фильтр, вылетает ошибка. Выделяет строчку с формулой. Для полноты картины вкладываю "исправленный" исходник.
Вложения
Тип файла: rar arrayarray.rar (8.7 Кб, 8 просмотров)
zzdxw вне форума Ответить с цитированием
Старый 25.10.2014, 18:15   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Делфи у меня нет при себе проверить не могу проект.
Лучше покажи текст ошибки.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.10.2014, 19:35   #7
zzdxw
Пользователь
 
Регистрация: 05.10.2014
Сообщений: 24
По умолчанию

В общем, по порядку. Приложение запускается. Когда открываю изображение и пытаюсь применить фильтр, приложение крашится.
Код:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, JPEG, Controls, Forms,
  Dialogs, ExtDlgs, StdCtrls, ExtCtrls, Menus;

type
  TForm1 = class(TForm)
    ScrollBox1: TScrollBox;
    Image1: TImage;
    OpenPictureDialog1: TOpenPictureDialog;
    SavePictureDialog1: TSavePictureDialog;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    A1: TMenuItem;
    N5: TMenuItem;
    procedure N3Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
  private
    { Private declarations }
    procedure LoadInArray;
  public
    { Public declarations }
  end;

const
  r_true=1;
  r_false=0;

type
  TRGB=record
    r,g,b:byte;
  end;

  ARGB=array [0..1] of TRGB;
  PARGB=^ARGB;

var
  Form1: TForm1;
  a:array of array of byte;
  gx:array of array of double;
  gy:array of array of double;
  BMPHeight,BMPWidth:integer;
  pixeldeleted:boolean;

implementation

{$R *.dfm}

procedure Sobel;
var
  i,j:integer;
    begin
    SetLength(gx, BMPWidth, BMPHeight);
    for i:=1 to BMPWidth-1 do
    for j:=1 to BMPHeight-1 do
    gx[i,j]:=(a[i-1,j+1]+2*a[i,j+1]+a[i+1,j+1])-(a[i-1,j-1]+2*a[i,j-1]+a[i+1,j-1]);
    SetLength(gy, BMPWidth, BMPHeight);
    for i:=1 to BMPWidth-1 do
    for j:=1 to BMPHeight-1 do
    gy[i,j]:=(a[i+1,j-1]+2*a[i+1,j]+a[i+1,j+1])-(a[i-1,j-1]+2*a[i-1,j]+a[i-1,j+1]);
      gx:=nil;
      gy:=nil;
    end;


procedure TForm1.N3Click(Sender: TObject);
begin
  if SavePictureDialog1.Execute then
  begin
    image1.Picture.SaveToFile(SavePictureDialog1.FileName);
  end;
end;

procedure TForm1.N2Click(Sender: TObject);
begin
  if OpenPictureDialog1.Execute then
  begin
    image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
    LoadInArray;
  end;
end;

procedure TForm1.N5Click(Sender: TObject);
var
  x,y:integer;
  val:integer;
  Ln:PARGB;
begin 

  Sobel;
   for y:=1 to BMPHeight-1 do
  begin
    Ln:=form1.image1.Picture.Bitmap.scanline[y];
    SetLength(gx, BMPWidth, BMPHeight);
    SetLength(gy, BMPWidth, BMPHeight);
    for x:=1 to BMPWidth-1 do
    begin
      val:= round(sqrt(sqr(gx[x,y])+sqr(gy[x,y])));
      if val>255 then
        val:=255;
      Ln[x].b:=val;
      Ln[x].g:=val;
      Ln[x].r:=val;
    end;
  end;
  form1.Image1.Repaint;
end;

procedure TForm1.LoadInArray;
var
  Ln:PARGB;
  x,y:integer;
begin
  if image1.Picture.Bitmap.PixelFormat<>pf24bit then
    image1.Picture.Bitmap.PixelFormat:=pf24bit;

  BMPHeight:=image1.Picture.height;
  BMPWidth:=image1.Picture.width;
   for y := 0 to BMPHeight-1 do
  begin
    Ln := form1.image1.Picture.Bitmap.scanline[y];
    for x := 0 to BMPWidth-1 do
    begin
    SetLength(a, BMPWidth, BMPHeight);
      a[x,y]:=(Ln[x].r+Ln[x].g+Ln[x].b) div 3;
      a:=nil;
    end;
   end;

end;
Изображения
Тип файла: jpg краш.jpg (29.5 Кб, 121 просмотров)
zzdxw вне форума Ответить с цитированием
Старый 25.10.2014, 19:47   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
a[x,y]:=(Ln[x].r+Ln[x].g+Ln[x].b) div 3;
a:=nil;
А эт что за фигня такая?
Зачем nil ставишь?
Код:
procedure TForm1.LoadInArray;
var
  Ln:PARGB;
  x,y:integer;
begin
  if image1.Picture.Bitmap.PixelFormat<>pf24bit then
    image1.Picture.Bitmap.PixelFormat:=pf24bit;

  BMPHeight:=image1.Picture.height;
  BMPWidth:=image1.Picture.width;

    SetLength(a, BMPWidth, BMPHeight);

  for y := 0 to BMPHeight-1 do
  begin
    Ln := form1.image1.Picture.Bitmap.scanline[y];
    for x := 0 to BMPWidth-1 do
    begin
      a[x,y]:=(Ln[x].r+Ln[x].g+Ln[x].b) div 3;
    end;
   end;

end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.10.2014, 20:36   #9
zzdxw
Пользователь
 
Регистрация: 05.10.2014
Сообщений: 24
По умолчанию

Ну я прочел, что nil нужно для освобождения памяти. В принципе, не обязательно, наверное.
a[x,y]:=(Ln[x].r+Ln[x].g+Ln[x].b) div 3 - без этой формулы открытое изображение просто закрашивается в черный цвет.

Цитата:
BMPWidth:=image1.Picture.width;

SetLength(a, BMPWidth, BMPHeight);

for y := 0 to BMPHeight-1 do
Поставил так, плюс убрал nil везде. Итог, все заработало. Правда, теперь фильтр применяется не на все BMP-шки... Крашится на той же строчке.
zzdxw вне форума Ответить с цитированием
Старый 25.10.2014, 20:51   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Ну я прочел, что nil нужно для освобождения памяти. В принципе, не обязательно, наверное.
Это даже не просто не обязательно а чрезвычайно опасно
nil ниразу не освобождает память. SetLength(...,0) - вот что нужно вызывать для освобождения памяти.
nil используется для освобождения памяти в СОМ модели, при работе с интерфейсами. Не знаю где ты такую чепуху прочел, но это скорее бред или ты не так понял.
Цитата:
фильтр применяется не на все BMP-шки
Видимо твоя формула дает выход за пределы массива.
Попробуй поставить
Код:
    for i:=1 to BMPWidth-2 do
    for j:=1 to BMPHeight-2 do
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Статические массивы + Си narco3 Помощь студентам 2 13.10.2012 00:59
[Pascal] Динамические и статические структуры Bolverk Фриланс 2 27.12.2011 19:00
[Pascal] Динамические и статические структуры Bolverk Помощь студентам 4 27.12.2011 14:59
Динамические двумерные массивы Razdolbam Помощь студентам 0 14.03.2011 15:37
Статические массивы aus Общие вопросы C/C++ 1 17.10.2010 15:32