Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глюк с копированием Bitmap, :-| 
:(
    Опции темы
Darksquall
  Дата 3.5.2006, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2004
Где: Москва

Репутация: нет
Всего: 4



Как считаете почему не работает вот это?

Код

bmp2:=Tbitmap.create;
bmptmp:=Tbitmap.create;

bmp2:=image2.Picture.Bitmap;

Str:=TMemorystream.Create;

bmp2.SaveToStream(Str);
bmptmp.LoadFromStream(Str);

image3.Picture.Bitmap:=bmptmp;


ошибка не вылетает но копирования в image3 не происходит.
правда ошибка вылетает здесь

Код

bmptmp.Free;
bmp2.Free;


но работает это.
Код

bmp2:=Tbitmap.create;
bmptmp:=Tbitmap.create;

bmp2:=image2.Picture.Bitmap;

bmp2.SaveTofile('C:\1.bmp');
bmptmp.LoadFromfile('C:\1.bmp');

image3.Picture.Bitmap:=bmptmp;


как еще можно скопировать один битмап в другой? 

p.s. Bmp1:=bmp2;
а также Assign () не подходят. 


--------------------
PM WWW ICQ   Вверх
Romikgy
Дата 3.5.2006, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146



Цитата(Darksquall @  3.5.2006,  22:12 Найти цитируемый пост)
p.s. Bmp1:=bmp2;
а также Assign () не подходят. 

интересно почему?
1. попиксельно можно 
2. память скопировать 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Darksquall
Дата 4.5.2006, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2004
Где: Москва

Репутация: нет
Всего: 4



Romik можно попиксельно,как угодно только что бы быстро.
А эти способы я так понимаю не копируют,а всего лишь указатели меняют в памяти, а при изменении памяти во всех переменных тоже будет изменение картинки, а мне этого не нужно. Битмап покрутил немного вроде так или я не прав? 


--------------------
PM WWW ICQ   Вверх
Kesh
Дата 4.5.2006, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 1
Всего: 54



Код

TmpBmp.Canvas.StretchDraw (Rect (0, 0, BMP2.width, Bmp2.Height), Bmp2);
 


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
Snowy
Дата 4.5.2006, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 18
Всего: 484



Код

bmp2.SaveToStream(Str);    
Str.Position := 0;
bmptmp.LoadFromStream(Str);
 
PM MAIL   Вверх
Alexeis
Дата 4.5.2006, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Darksquall, Конечно! после записи в поток внутренний указатель потока смещается в конец. Рекомендуется его перед любой записью и чтением устанавливать в нуль.
Цитата(Darksquall @  3.5.2006,  23:17 Найти цитируемый пост)
А эти способы я так понимаю не копируют,а всего лишь указатели меняют в памяти
 - про assign это не совсем так, дело в том что при выполнении этого метода скорее всего будет то что вы описали, но после первой же попытки модифицировать любой из битмапов (или удалить), программа создаст две различные независимые копии битмапов для каждого из объектов.
 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Darksquall
Дата 4.5.2006, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2004
Где: Москва

Репутация: нет
Всего: 4



Благодарю, совсем работа замучала, забыл что Position в стриме в нуль устанавливать нужно :-) 


--------------------
PM WWW ICQ   Вверх
Snowy
Дата 4.5.2006, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 18
Всего: 484



Цитата(alexeis1 @  4.5.2006,  10:28 Найти цитируемый пост)
про assign это не совсем так, дело в том что при выполнении этого метода скорее всего будет то что вы описали, но после первой же попытки модифицировать любой из битмапов (или удалить), программа создаст две различные независимые копии битмапов для каждого из объектов.
Без всяких первых попыток.
Assign - метод унаследованный от TPeristent.
Производит копирование всех property из одного объекта в другой.
(Естественно, объекты должны быть совместимы от младшего к старшему. Но совместимость не касается данной темы.)  
PM MAIL   Вверх
Alexeis
Дата 4.5.2006, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Snowy, но изображение является указателем на область памати не знаю как копируется свойство 
property ScanLine[Row: Integer]: Pointer,
но подозреваю, что копируется только указтель на память, и вместе с тем счетчик ссылок увеличится на единицу, и только при попытке изменить изображение программа должна делать действительную копию(токова концепция Delphi). Но это лишь мое предположение... 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Snowy
Дата 4.5.2006, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 18
Всего: 484



Сам битмап является пропертёй.
Соответственно при Assign у приёмника создается новый TBitmap.
А содержимое изображения переносится уже при помощи WinAPI (вероятно через BitBlt или т.п. ).
Это уже забота класса - перенести корректно все данные.
Вот, кстати из описаловы:
Цитата
      Assign - Copys the contents of the given TPicture.  Used most often in
        the implementation of TPicture properties.
 
PM MAIL   Вверх
Alexeis
Дата 4.5.2006, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Snowy, чтож с этим не поспоришьsmile, но я имел ввиду другую ситуацию.
Код

bmp1:=Tbitmap.create;    
bmp2:=Tbitmap.create;
bmp1.Assign(bmp2);

Или в этом случае тоже самое?

Добавлено @ 11:26 
Цитирую код VCL метода assign TBitmap
Цитата

FImage := TBitmap(Source).FImage;

Это очень похоже на простое копирование внутреннего адреса изображения. 

FImage объявлен как объект класса TBitmapImage

дальше идет
Код

        FTransparent := TBitmap(Source).FTransparent;
        FTransparentColor := TBitmap(Source).FTransparentColor;
        FTransparentMode := TBitmap(Source).FTransparentMode;
  

Это сообщение отредактировал(а) alexeis1 - 4.5.2006, 11:29


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Snowy
Дата 4.5.2006, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 18
Всего: 484



Хм. И правда.
Оказывается там внутрях хитрая система референсов.
Правда незнаю, насколько она оправдана. Но ты прав... 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0646 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.