Форум: "Начинающим";
Текущий архив: 2006.06.18;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.01 c