![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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