Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Преобразовать Graphic в BitMap [D7, WinXP]


Страницы:   1 2 3

gunner ©   (2003-09-03 14:20:00) 

У меня в Image.Picture.Graphic находится изображение
что нужно сделать чтобы это изображение перегнать в Image2.Picture.BitMap ?

Заранее спасибо !


olb   (2003-09-07 09:56:00) [1]

По поводу разрешения и метрических размеров изображения. IMHO: придется забыть. Многие форматы (напр., .gif) просто не поддерживают ни метрики, ни разрешения. Хранят только размер в точках.


ZEE   (2003-09-04 10:51:00) [2]

точно...
буду закруглятся с этими рассуждениями - т.к. мои познания в этой области закончились еще несколько постов назад :)


gunner   (2003-09-04 10:46:00) [3]

Какая то жопа с клеем получается :)


ZEE   (2003-09-04 10:40:00) [4]

Скорее всего при "конвертации Graphic в Bitmap" данные о DPI не заполняются так как просто их нет в Graphic
т.е. изначально при создании Bitmap эти данные нулевые и при копировании (конвертации) переносятся только Pixels, а всю остальную инфу вероятно надо самому прописывать - руками...


gunner   (2003-09-04 10:33:00) [5]

У меня складывается впечатление, что BitMap достаточно кривой
он теряет данные о DPI и ещё всякое разное. Попробывал сохранить в файл Картинку и открыл в ФотоШопе сведеней о DPI там не оказалось... то есть даже своими средствами такими как SaveToFile TBitMap не может сохранить все данные заголовка. Получается чтоих там нет вообще, то есть наверное они теряются во время конвертации Graphic в Bitmap
Других сооброжений у меня нет.. или существуют какие то другие механизмы..........


gunner   (2003-09-04 10:19:00) [6]

существует такая API функция GetObject

Делаю следующее

DIB : TDIBSection;

GetObject(ImgScan.Image1.Picture.Bitmap.Handle, SizeOf(DIB), @DIB);

В итоге в DIP возвращаются только размеры все остальные данные заголовка забиты нулями


ZEE   (2003-09-04 10:16:00) [7]

аааа... ясно - покопайся в исходниках Graphics.pas - там есть что-то типа того - правда это относится к DIB - в общем ищи процедуру TBitmap.ReadDIB() или сразу ищи biYPelsPerMeter


gunner   (2003-09-04 10:09:00) [8]

> ZEE ©

Мне нужно DPI это biYPelsPerMeter и biXPelsPerMeter
в чистом BMP в заголовке эти данные присутствуют
PixelFormat - это помоему не то


ZEE   (2003-09-04 09:56:00) [9]

>me (03.09.03 18:23) [29]
по этому поводу спорить не буду - наверно me лучше разбирается в этом вопросе (но у меня утечек памяти не было - см. [15])


ZEE   (2003-09-04 09:54:00) [10]

может я не понял что такое DPI, но подозреваю что это TBitmap.PixelFormat


gunner   (2003-09-04 09:00:00) [11]

Так продолжаем разговор :)

Почему после конвертации теряются данные в загаловке BitMap
остаются только размеры. А мне нужно чтобы ещё сохранилось DPI в частности !


gunner   (2003-09-04 08:41:00) [12]

> ZEE
Большое тебе спасибо !
Всё получилось !


gunner   (2003-09-04 08:36:00) [13]

Вот вы тут развернулись ! :)


me   (2003-09-03 18:23:00) [14]

Из приведённых кусков кода следует, что
для того, чтобы изменить Graphics на TBitmap,
достаточно всего лишь вызова TPicture.GetBitmap.

И то, что при
Image2.Picture.Bitmap:=TBitmap.Create;
внутри Image2.Picture будет создан новый битмап
(если Graphics не TBitmap), а созданный тобой битмап
никогда освобождён не будет и пополнит собой
длинный список утечек памяти.


ZEE   (2003-09-03 18:12:00) [15]

>me (03.09.03 18:06) [27]
>при присваивании произойдёт создание TBitmap внутри
при присваивании да, а при копировании (Canvas.Draw) - нет


me   (2003-09-03 18:06:00) [16]

ZEE ©
>...а вот Bitmap (и компания - см. выше) создается руками...
>А еще лучше - читай F1 :)

Ещё лучше заглядывай в исходный код:

procedure TPicture.SetBitmap(Value: TBitmap);
begin
SetGraphic(Value);
end;

procedure TPicture.SetGraphic(Value: TGraphic);
var
NewGraphic: TGraphic;
begin
// при присваивании произойдёт создание TBitmap внутри
NewGraphic := nil;
if Value <> nil then
begin
NewGraphic := TGraphicClass(Value.ClassType).Create;
NewGraphic.Assign(Value);
NewGraphic.OnChange := Changed;
NewGraphic.OnProgress := Progress;
end;
try
FGraphic.Free;
FGraphic := NewGraphic;
Changed(Self);
except
NewGraphic.Free;
raise;
end;
end;

function TPicture.GetBitmap: TBitmap;
begin
ForceType(TBitmap); // Если Graphic - не битмап, он будет уничтожен и создан битмап
Result := TBitmap(Graphic);
end;

procedure TPicture.ForceType(GraphicType: TGraphicClass);
begin
if not (Graphic is GraphicType) then
begin
FGraphic.Free;
FGraphic := nil;
FGraphic := GraphicType.Create;
FGraphic.OnChange := Changed;
FGraphic.OnProgress := Progress;
Changed(Self);
end;
end;


Skier   (2003-09-03 18:03:00) [17]


> А еще лучше - читай F1 :)

Сурово ! :)


ZEE   (2003-09-03 17:49:00) [18]

У TPicture все заносится в Graphic (Bitmap, Icon, MetaFile, JpegImage, etc) поэтому поумолчанию есть только Graphic, а вот Bitmap (и компания - см. выше) создается руками, ну правда при занесении картинки в Image в дизайне соотв. Create происходит автоматом...
А еще лучше - читай F1 :)


Skier   (2003-09-03 17:41:00) [19]

>ZEE © (03.09.03 17:37)
Нет. Я всё понял правильно.
Вот только это строка всё ж таки вызывает у меня подозрение : Image2.Picture.Bitmap:=TBitmap.Create;

Bitmap это св-во TPicture.
TPicture сам знаем когда его создать когда разрушить.
Не будет ли такое создание Bitmap"а опасным...


ZEE   (2003-09-03 17:37:00) [20]

небольшая оговорка "Ты не прав" - имелось ввиду "Skier не прав"
(а то посмотрел на эту строку
if Image.Picture.Bitmap.Empty then Ты не прав
else Я не прав
и подумал, что может показаться что-то не то...)


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо