Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.012 c
1-1147133271
ValdikSS
2006-05-09 04:07
2006.06.18
Замена ресурсов в w32 EXE на дельфи


15-1148454413
boriskb
2006-05-24 11:06
2006.06.18
Кто он?


2-1149135720
Laymer
2006-06-01 08:22
2006.06.18
Классы


15-1148363456
Хельг
2006-05-23 09:50
2006.06.18
Basic в OpenOffice


3-1145602125
daimyo
2006-04-21 10:48
2006.06.18
DBGrid получение имени колонки





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский