Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.18;
Скачать: CL | DM;

Вниз

array to image   Найти похожие ветки 

 
zxcv   (2006-05-31 16:29) [0]

народ подскажите что не так
пытаюсь создать ф-ю для перевода массива в картинку
при использовании выскакивает ошибка
типа "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;


 
Kolan ©   (2006-05-31 16:40) [1]


> 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


 
han_malign ©   (2006-05-31 16:43) [2]

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


 
tesseract ©   (2006-05-31 16:43) [3]

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


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

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

то tesseract

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

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


 
tesseract ©   (2006-05-31 17:27) [5]

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;


 
Kolan ©   (2006-05-31 18:23) [6]


> result.create ?

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

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

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


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

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

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 20:03) [8]

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


 
tesseract ©   (2006-05-31 21:30) [9]


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

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


 
Loginov Dmitry ©   (2006-05-31 22:59) [10]

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


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


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

чем scanline лучше?


 
Loginov Dmitry ©   (2006-05-31 23:04) [12]

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


 
tesseract ©   (2006-05-31 23:19) [13]


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

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


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

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


 
Loginov Dmitry ©   (2006-06-01 10:17) [15]

Загляни в реализацию свойства 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;


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



Страницы: 1 вся ветка

Текущий архив: 2006.06.18;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.041 c
10-1120575391
Yurij-7
2005-07-05 18:56
2006.06.18
Word : Поиск и замена


15-1148225596
antonn
2006-05-21 19:33
2006.06.18
Профессии...


2-1149014146
serko
2006-05-30 22:35
2006.06.18
TEdit


2-1149072620
adalx
2006-05-31 14:50
2006.06.18
Помогите новичку


2-1149009762
Sapan
2006-05-30 21:22
2006.06.18
Вопрос