Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

array to image


zxcv ©   (2006-05-31 16:29:00) 

народ подскажите что не так
пытаюсь создать ф-ю для перевода массива в картинку
при использовании выскакивает ошибка
типа "access violation"
function arr2im(arr:array):Tbitmap;
var
  i,j:integer;
begin
result.Width:=Length(arr[0]);
result.Height:=Length(arr);
for i:=0 to Length(arr)-1 do
for j:=0 to Length(arr[0])-1 do
  begin
   result.Canvas.Pixels[i,j]:=RGB(arr[i,j],arr[i,j],arr[i,j]);
  end;
end;


Loginov Dmitry   (2006-06-01 10:17:00) [1]

Загляни в реализацию свойства Pixels (метод SetPixel). Убедишься, что выполняется длинный ряд каких-то действий, прежде чем изменить значение самого пикселя. Но в итоге используется процедура Windows.SetPixel, которую ты сам можешь использовать (но скорость увеличится не значительно - всего-то раза в 2-3).

Использование Scanline позволяет получить доступ к пикселям, как к элементам массива, хранящегося в ОЗУ. Тогда обработка пикселей выглядит примерно так:

var
 I, J: Integer;
 Pixels: PIntegerArray;

 Bmp := TBitmap.Create;.
 with Bmp do
 begin
   PixelFormat := pf32bit;
   Height := H;
   Width := W;
   for I := 0 to H - 1 do
   begin
     Pixels := Scanline(I);
     for J := 0 to W - 1 do
       Pixels[J] := RGB(arr[i,j], arr[i,j], arr[i,j]);
   end;
 end;


Примерно так. Возможно, нарушится порядок перечисления цветовых составляющих, то там  сам разберешься.


zxcv   (2006-05-31 23:39:00) [2]

а по подробней
в смысле почему быстрее


tesseract   (2006-05-31 23:19:00) [3]


> Быстрее... Раз так в ..надцать..

Не совсем так, но быстрее. Учитывая, что используется RGB.


Loginov Dmitry   (2006-05-31 23:04:00) [4]

Быстрее... Раз так в ..надцать..


zxcv   (2006-05-31 23:02:00) [5]

чем scanline лучше?


Loginov Dmitry   (2006-05-31 22:59:00) [6]

zxcv   (31.05.06 20:01) [7]
эта ф-я используется в цикле
после 100 раз начинаются тормоза


Конечно тормоза начнуться! Кто же использует свойство Pixels?
Scanline - совсем другая тема :)


tesseract   (2006-05-31 21:30:00) [7]


> Используй совет tesseract ©   (31.05.06 17:27) [5]. Битмап
> создавай снаружи функции....

конечно не имеет, имеет смысл Array of smth.


Kolan   (2006-05-31 20:03:00) [8]

Используй совет tesseract ©   (31.05.06 17:27) [5]. Битмап создавай снаружи функции....


zxcv   (2006-05-31 20:01:00) [9]

получилось так:

begin
result:=Tbitmap.Create;
result.Width:=Length(arr);
result.Height:=Length(arr[0]);
for i:=0 to result.Width-1 do
for j:=0 to result.Height-1 do
  begin
   result.Canvas.Pixels[i,j]:=RGB(arr[i,j],arr[i,j],arr[i,j]);
  end;
end;

эта ф-я используется в цикле
после 100 раз начинаются тормоза
я так понимаю нужно что то вроде
result.Free;
как быть?


Kolan   (2006-05-31 18:23:00) [10]


> result.create ?

Нет. Когда вызывается конструктор объект еще не создан, поэтому ваш вызов приведет к AV.
Конструктор вызовается так
MyObject := TMyClass.Create;
В вашем случае:
Result := TBitmap.Create;

> tesseract ©   (31.05.06 17:27) [5]
>
> function arr2im(arr: array;var mybmp:Tbitmap);

Так что эта запись имеет здравый смысл?


tesseract   (2006-05-31 17:27:00) [11]

function arr2im(arr:array;var mybmp:Tbitmap);

var
 i,j:integer;
begin
mybmp.Width:=Length(arr[0]);
mybmp.Height:=Length(arr);
for i:=0 to Length(arr)-1 do
for j:=0 to Length(arr[0])-1 do
 begin
  mybmp.Canvas.Pixels[i,j]:=RGB(arr[i,j],arr[i,j],arr[i,j]);
 end;


zxcv   (2006-05-31 16:55:00) [12]

то Kolan
массив определил
Отдаваемый в ф-ю массив всегда начинается с 0

то tesseract

result.create ?
если так то всеровно тоже самое

/// не проще ли созданный битмап в функцию передать
  это как?


han_malign   (2006-05-31 16:43:00) [13]

а экземпляр класса Пушкин создавать будет?


tesseract   (2006-05-31 16:43:00) [14]

Угу, а кто Result создавать будет? не проще ли созданный битмап в функцию передать?


Kolan   (2006-05-31 16:40:00) [15]


> function arr2im(arr:array):Tbitmap;

Это что значит? Массив определяется так:
Arr: array of <Тип>.


> for i:=0 to Length(arr)-1 do

Когда исправите тип, стоит это переделать так:
for I := Low(Arr) to High(Arr) do
Так как первый индекс запросто может быть не 0 а 10


Наверх

Титульная страница Поиск, карта сайта Написать письмо