Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.182 c
2-1333709191
Jimmy
2012-04-06 14:46
2013.03.22
Как избавится от мерцания?


15-1330865114
Дмитрий С
2012-03-04 16:45
2013.03.22
Установка драйвера от другой ОС.


2-1335889883
PacMan
2012-05-01 20:31
2013.03.22
TThread копирование файла в 2-х потоках


15-1337839149
Cobalt
2012-05-24 09:59
2013.03.22
Кто пойдет на "Кросс-платформу"?


15-1332688326
Дмитрий С
2012-03-25 19:12
2013.03.22
Физически 32х битная система может иметь доступ к





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