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

Вниз

Картинки в массив и обратно   Найти похожие ветки 

 
andrewtitoff ©   (2012-04-18 17:00) [0]

Здравствуйте!, подскажите как правильно сохранять картинки в массив из TImage, а потом обратно показывать их?

У меня на форме 5шт TImage, сначала мне нужно загрузить картинки в массив, для этого я использую TImage (в него все нормально грузится), а потом из него пытаюсь сохранить картинку в массив ну и потом обратно из массива показать в нужном TImage но почему-то то-ли не сохраняется в массив, то-ли не отображается... =(((

...
type
 OBYA = packed record
 DAT : string;
 IMG : string;
 PRI : string;
 HTT : string;
 PRS : string;
 MET : string;
 PIS : TPicture;
 PB1 : TPicture;
 PB2 : TPicture;
 PB3 : TPicture;
 PB4 : TPicture;
 PB5 : TPicture;
 TEP : TPicture;
 TEL : string;
    end;

....

var
 Z: Array of OBYA;
 ms:   TMemoryStream;
 jpeg: TJpegImage;
 .....

 ms := TMemoryStream.Create;
 jpeg := TJpegImage.Create;
  try
  http1.Get(Z[coun-1].IMG, ms);
  ms.Position := 0;
  jpeg.LoadFromStream(ms);
  Image1.Picture.Graphic := jpeg;
  finally
  jpeg.Free; ms.Free;
  http1.Disconnect;
  end;

 Z[coun-1].PIS:=Image1.Picture;

.....

  Image1.Picture:=Z[i].PB1;
  Image2.Picture:=Z[i].PB2;
  Image3.Picture:=Z[i].PB3;
  Image4.Picture:=Z[i].PB4;
  Image5.Picture:=Z[i].PIS;

....


 
stas ©   (2012-04-18 17:15) [1]

Потому что  Z[coun-1].PIS:=Image1.Picture; это ты присваиваешь ссылку. Тебе надо создавать каждый раз новый Image и удалять при очистке массива.

1. Вместо динамического массива лучше использовать TStringList или подобные
2. Я бы хранил TJpegImage вместо Picture


 
andrewtitoff ©   (2012-04-18 17:28) [2]


> Потому что  Z[coun-1].PIS:=Image1.Picture; это ты присваиваешь
> ссылку. Тебе надо создавать каждый раз новый Image и удалять
> при очистке массива.
>

Ясн, т.е. тогда PIS,PB1..PB5 должны быть TImage а не TPicture или я что то не так понял?


> 1. Вместо динамического массива лучше использовать TStringList
> или подобные
>

Почему?, чем динамический массив плох?


> 2. Я бы хранил TJpegImage вместо Picture
>
>


Опять же в чем разница?, мне это не принципиально, просто хотелось бы знать почему а не просто делать так потому что кто-то так сказал... =)))


 
Palladin ©   (2012-04-18 17:35) [3]

http://codingrus.ru/readarticle.php?article_id=2867


 
andrewtitoff ©   (2012-04-18 17:37) [4]


> http://codingrus.ru/readarticle.php?article_id=2867

И к чему это?


 
sniknik ©   (2012-04-18 17:39) [5]

> И к чему это?
причина


 
sniknik ©   (2012-04-18 17:44) [6]

> Image1.Picture:=Z[i].PB1;
если ты так присваиваешь, то в Z[i].PB1 должен быть "цельный" объект, а не ссылка на возможно уже "битый".
т.е. в коде выше первым должно стоять
Z[coun-1].PIS:= TPicture.Create;
дальше все операции с ним, и не в коем случае не делать Z[coun-1].PIS.Free; до тех пор пока объект станет реально не нужен.


 
andrewtitoff ©   (2012-04-18 17:45) [7]


> причина

Причина чего?, не понимания или не желания понимать сути вопроса?..


 
sniknik ©   (2012-04-18 17:47) [8]

в чем суть?


 
AV ©   (2012-04-18 17:50) [9]

если просто, то переделать просто

не
jpeg := TJpegImage.Create;
и потом телодвижения

а сразу
Z[coun-1].PIS := TJpegImage.Create;

соотв.
PIS : TJpegImage;


 
andrewtitoff ©   (2012-04-18 17:50) [10]


> > Image1.Picture:=Z[i].PB1;
> если ты так присваиваешь, то в Z[i].PB1 должен быть "цельный"
> объект, а не ссылка на возможно уже "битый".
> т.е. в коде выше первым должно стоять
> Z[coun-1].PIS:= TPicture.Create;
> дальше все операции с ним, и не в коем случае не делать
> Z[coun-1].PIS.Free; до тех пор пока объект станет реально
> не нужен.
>
>


Так это я уже давно понял благодаря stas-у, просто я написал немножко не правильно (со скобочками) и получил
[DCC Error] Unit1.pas(165): E2010 Incompatible types: "TPicture" and "TImage"
вот по этому и спросил.., спасибо что поправили =)))


 
andrewtitoff ©   (2012-04-18 17:55) [11]

написал так:
 Z[coun-1].PIS:= TPicture.Create;
 Z[coun-1].PIS:=Image1.Picture;

только почему-то все равно не работает.. =(((


 
andrewtitoff ©   (2012-04-18 17:57) [12]


> соотв.
> PIS : TJpegImage;
>
>

Ааа, понял,  ну в принципе да, только потом же опять как я понял нужны телодвижения что-бы запихнуть его в TImage..?


 
andrewtitoff ©   (2012-04-18 17:58) [13]


> в чем суть?
>
>

В беспредметности разговора.. =)))


 
sniknik ©   (2012-04-18 17:59) [14]

ой, и не говори, что ты "уже понял". почитай лучше ссылку, суть там.


 
icWasya ©   (2012-04-18 18:13) [15]

Вот это
Z[coun-1].PIS:= TPicture.Create;
надо сделать один раз

А вместо этого
Z[coun-1].PIS:= Image1.Picture;
можно несколько раз делать
Z[coun-1].PIS.Assign(Image1.Picture);

а за вот этим присваиванием
 Image1.Picture:=Z[i].PIS
Дельфи сама ставит такой код
 Image1.Picture.Assign(Z[i].PIS);

Учите матчасть


 
Ega23 ©   (2012-04-18 18:55) [16]


> stas ©   (18.04.12 17:15) [1]
>
> 1. Вместо динамического массива лучше использовать TStringList или подобные


Иногда. Иногда - нет. Иногда - ваще противопоказано.


> 2. Я бы хранил TJpegImage вместо Picture


Почему не битмап? Почему не MemoryStream?


 
stas ©   (2012-04-19 09:08) [17]


> Почему?, чем динамический массив плох?

Не нужно голову морочить с выделением памяти и т.д. в TSTringList есть минимальный набор методов для работы c динамическими массивами

Ega23 ©   (18.04.12 18:55) [16]
1. Не встречал случаев когда это противопоказано.
2.Потому что битмап занимает больше места в ОЗУ, а со Stream чтобы выгрузить надо будет еще движения какие-то делать.


 
Ega23 ©   (2012-04-19 09:14) [18]


> 1. Не встречал случаев когда это противопоказано.


Возможно вы мало программировали.


> а со Stream чтобы выгрузить надо будет еще движения какие-то делать.


А с TJPEGImage - не надо???? Сначала битмап привести к джпегу, потом заассайнить его с элементом массива (через тот же стрим). Да, ещё создать надо...


 
andrewtitoff ©   (2012-04-19 10:24) [19]


> а за вот этим присваиванием
>  Image1.Picture:=Z[i].PIS
> Дельфи сама ставит такой код
>  Image1.Picture.Assign(Z[i].PIS);


Пробовал и так и так, чет не работает, вернее у меня сейчас показывает в цикле с - так вот показывет картинку один раз и потом она пустая, может нужно какой-то рефреш делать или обнулять перед тем как новую картинку загружать?


for i := 0 to coun-1 do
begin
  RichEdit1.Lines.Add(Z[i].DAT);
  ...
  Image5.Picture.Assign(Z[i].PIS);

  Application.ProcessMessages;
  Sleep(1000);
  Application.ProcessMessages;
end;


 
stas ©   (2012-04-19 11:21) [20]


> Ega23 ©   (19.04.12 09:14) [18]
> Возможно вы мало программировали.

Возможно, приведите пример, буду знать на будущее

>Сначала битмап привести к джпегу

Зачем? он загружает jpeg.


 
stas ©   (2012-04-19 11:24) [21]

andrewtitoff ©   (19.04.12 10:24) [19]

Ну, это вы показали вывод из массива, а как загружаете в массив?


 
andrewtitoff ©   (2012-04-19 11:48) [22]


> Ну, это вы показали вывод из массива, а как загружаете в
> массив?


Так вроде как писал уже, или вы про что?...


> Z[coun-1].PIS:= TPicture.Create;
>  Z[coun-1].PIS:=Image1.Picture;
>


У меня пока что только один раз нужно загрузить т.е. для каждого Z[i].PIS в цикле я делаю это один раз


 
stas ©   (2012-04-19 11:54) [23]

Z[coun-1].PIS.Assign(Image1.Picture)


 
stas ©   (2012-04-19 12:00) [24]

andrewtitoff ©   (19.04.12 11:48) [22]
Пойми когда пишешь равно ты приравниваешь ссылку, а не содержимое.
Допустим

1. в гостиничный номер №36 поселен andrewtitoff
2. Z[1].PIS=№36
3. На следующей итерации в №36 поселился Ega
4. Z[2].PIS=№36
У тебя получилось что все элементы массива ссылаются на №36 и во всех живет Ega. А Assign забирает именно кто же живет в этом номере...

Понятно ))?


 
andrewtitoff ©   (2012-04-19 12:49) [25]


> Пойми когда пишешь равно ты приравниваешь ссылку, а не содержимое.

Ааа, понял, спс, сейчас попробую.

только я не понял тогда почему у меня тогда получилось в цикле вывода при первом прохождении цикла выдал картинки (с нужным индексом или нет не разбирался), при чем переделано в цикле вывода было только для одного TImage, а остальные были по старому Image1.Picture:=Z[i].PB1;, но тем не менее показал 5 картинок, но уже на втором прохождении цикла и до конца все 5 TImage были пусты...


 
andrewtitoff ©   (2012-04-19 12:56) [26]


> Z[coun-1].PIS.Assign(Image1.Picture)


Да, спасибо, попробовал, так вроде работает, действительно чет я не допер что это не просто элемент массива а объект =)))
P.S.
Эх, как чудесно все было 15 лет назад в паскале, все можно было реализовать без объектов, да винда еще не была в ходу(3.11 не в счет), все просто и понятно, на прямую к железу =)))


 
sniknik ©   (2012-04-19 12:57) [27]

> почему у меня тогда получилось
предполагаю, что там, тогда, был TImage на обоих сторонах, а у него Picture метод, где в обработчике "усе путем"...
почитал бы ссылку, вник, вместо "упрямства".


 
sniknik ©   (2012-04-19 12:59) [28]

> чет я не допер что это не просто элемент массива а объект =)))
ну как же допер, "додолбили"... с самого начала только это и пишут.


 
andrewtitoff ©   (2012-04-19 13:05) [29]


> почитал бы ссылку, вник, вместо "упрямства".

Да прочитал я ее давно уже, ничего нового там нет, просто опыт нужен, которого у меня нет.

> ну как же допер, "додолбили"... с самого начала только это
> и пишут.

Ну так я и говорю что тупанул, подумал сначала только про TImage которые на форме, а то-что в массиве все тоже самое у меня - не подумал... =))))


 
andrewtitoff ©   (2012-04-19 15:04) [30]

А может быть еще кто-нибудь подскажет как загрузить картинку PNG ? =)))


 
stas ©   (2012-04-19 15:22) [31]

Так же как JPEG, только в uses PNG надо включить, не знаю стандартный модуль есть или нет


 
andrewtitoff ©   (2012-04-19 16:26) [32]


> Так же как JPEG, только в uses PNG надо включить, не знаю
> стандартный модуль есть или нет

Спс, правда я еще ссылку на картинку не разобрался как получить, как разберусь - попробую


 
Palladin ©   (2012-04-20 00:09) [33]

феерические люди были есть и будут быть...


 
andrewtitoff ©   (2012-04-20 09:23) [34]


> феерические люди были есть и будут быть...

Что-то не так?.. =)))
Хотите поговорить об этом? ;)))



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

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

Наверх




Память: 0.56 MB
Время: 0.058 c
2-1346243863
cambit
2012-08-29 16:37
2013.03.22
Немогу сообразить - начинающий (тока-тока)


2-1336072088
Глеб
2012-05-03 23:08
2013.03.22
Склеивание форм в дельфи


15-1338216754
leklerk
2012-05-28 18:52
2013.03.22
Когда нужно использовать ООП?


15-1331419316
Дмитрий С
2012-03-11 02:41
2013.03.22
Шифрование диска. Теоретический вопрос.


6-1247157100
axis_of_evil
2009-07-09 20:31
2013.03.22
TidSMTP