Главная страница
    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.48 MB
Время: 0.012 c
3-1145713031
Alpine
2006-04-22 17:37
2006.06.18
IB 7.01 проблемма с кодировкой.


1-1147332028
leonidus
2006-05-11 11:20
2006.06.18
Как отображать в TLabel русский, испанский и английский текст?


1-1147412552
Chaser
2006-05-12 09:42
2006.06.18
Отображение иконок в TreeView


5-1133168076
DimaBr
2005-11-28 11:54
2006.06.18
ПодСвойство компонента


3-1145550898
-= Acid=-
2006-04-20 20:34
2006.06.18
скорость поиска в ClientDataSet





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский