Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2010, 10:24   #1
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию рисование png

Как можно рисовать png на Делфи? я пробовал через TPNGObject но там тока есть pixels через Tgraphic но там я незнаю как сделать фон прозрачным тоесть альфа канал.
Воображение важнее, чем знания. (Albert Einstein)
dmitriegorovih вне форума Ответить с цитированием
Старый 01.08.2010, 13:32   #2
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Рисовать в gdi можно только битмап... Когда в программах изображение редактируется/отображается - оно сначала конвертируется в битмап, а уже потом все манипуляции с битмапом происходят...
Попробуйте конвертировать TPNGObject в TBitmap и рисовать уже его...
Цитата:
альфа канал
Не пользовался давно уже TPNGObject, но вроде там TPNGObject.CreateAlpha; есть?
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 01.08.2010, 23:12   #3
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

Цитата:
но вроде там TPNGObject.CreateAlpha; есть?
Есть но как можно конвертировать? можете напримере или исходник просто я даже и понятия не имею как это делаеться. Я слышал гдето а именно видел что если сделать битмап на каждый пиксель по 4 байта то 4-тый будет альфа прозрачность?
Воображение важнее, чем знания. (Albert Einstein)
dmitriegorovih вне форума Ответить с цитированием
Старый 02.08.2010, 00:33   #4
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
Лампочка

Многие почему-то упорно считают что bmp с полупрозрачностью не бывает... Но это просто не каждый вьювер их правильно отображает...
Цитата:
Сообщение от dmitriegorovih Посмотреть сообщение
Я слышал гдето а именно видел что если сделать битмап на каждый пиксель по 4 байта то 4-тый будет альфа прозрачность?
Это называется 32-битное изображение (ARGB), оно с 256-тиуровневой полупрозрачностью...
В VCL называют pf32bit... Класс-обёртка TBitmap тем и хорош что все преобразования делает сам... Если у нас есть переменная "Var MyPict: TBitmap;", то достаточно написать в коде "MyPict.PixelFormat:=pf32bit;" и она сама преобразуется в "на каждый пиксель по 4 байта"...

На DelphiMaster'ах ссыль на хороший пример давали:
Цитата:
Мастера DELPHI: Сообщение от antonn (23.01.10 19:57)

дарю
http://desksoft.ru/index.php?downloa...chments&id=254 (465кб, zip)

грубо, но вполне показательно Конвертим png в tbitmap и делаем что хотим
Там всё что нужно показано...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 02.08.2010, 08:34   #5
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

DomiNick спасибо буду разбирать если вдруг что опишусь сдесь

DomiNick Извените за маю не доходчивость но как мне рисовать в bmp просто я начинал рисовать но нечего не показывало
Воображение важнее, чем знания. (Albert Einstein)

Последний раз редактировалось dmitriegorovih; 02.08.2010 в 12:03.
dmitriegorovih вне форума Ответить с цитированием
Старый 02.08.2010, 16:15   #6
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
Вопрос

Эм... Что именно не получается? Как вы его выводите на форму?
Как-то примерно так нужно:
Код:
. . .
bf.BlendOp:=AC_SRC_OVER;
bf.BlendFlags:=0;
bf.SourceConstantAlpha:=255;
bf.AlphaFormat:=AC_SRC_ALPHA;
. . .

Procedure TForm1.FormPaint(Sender: TObject);
Begin
If (Bmp.PixelFormat=pf32bit) Then
      Windows.AlphaBlend(Form1.Canvas.Handle, l, t, w, h, Bmp.Canvas.Handle, 0, 0, w, h, bf) // битмап должен быть уже после PremultAlpha()
Else
      Windows.StretchBlt(Form1.Canvas.Handle, l, t, w, h, Bmp.Canvas.Handle, 0, 0, w, h, SRCCOPY);
End;
Цитата:
рисовать в bmp
Обычно функции рисования GDI просто затирают альфа-канал...
I am the First of Cyber Evolution...
I am the First to Program your Future...

Последний раз редактировалось DomiNick; 02.08.2010 в 16:17.
DomiNick вне форума Ответить с цитированием
Старый 02.08.2010, 20:27   #7
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

Мне нужно на image(э) рисовать а это я так понимаю на "окнах"
Воображение важнее, чем знания. (Albert Einstein)
dmitriegorovih вне форума Ответить с цитированием
Старый 02.08.2010, 23:59   #8
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

TImage не умеет рисоваться с полупрозрачностью... Чтоб нормально отображались 32хбитные изображения - придётся делать так...
Рисуете в "переменной" Bmp, а тот код его просто отображает на форме...
А ведь сам TImage точно так же и сделан...

Только если рисовать что-то, то возможно понадобится дополнительный битмап для PremultAlpha (AlphaBlend)...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 03.08.2010, 12:50   #9
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

Чёто у меня не чего не получаеться с прорисовкой хотелось бы png но наверное придёться bmp

Я извеняюсь за своё не понимание смотрите как я это сделал
Код:
image1.Transparent:=true;
image1.Canvas.Pen.Width:=5;
image1.Canvas.MoveTo(0,0);
image1.Canvas.LineTo(100,100);
потом чтоб сконвертировать в png надо сделать так
Код:
uses ...,pngimage;

...

var
png:TPNGobject;
begin
png:=TPNGobject.create;
image1.Picture.Bitmap.PixelFormat:=pf32bit;
png.assign(image1.Picture.Bitmap);
png.savetofile('1.png');
freeandnil(png);
end;
Воображение важнее, чем знания. (Albert Einstein)

Последний раз редактировалось Stilet; 16.08.2010 в 09:04.
dmitriegorovih вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PNG _-Re@l-_ Общие вопросы Delphi 8 15.07.2010 16:48
Ковертирование из png 24 бит в png 8 бит isat Общие вопросы .NET 0 22.03.2010 13:38
PNG Button Altera Компоненты Delphi 2 13.10.2008 18:54
*.png Killbrum Помощь студентам 3 30.08.2008 15:51
Png Witaliy Мультимедиа в Delphi 3 25.05.2008 23:10