Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

jpeg transparent [Delphi, Windows]


RusSun ©   (24.08.11 20:48

Доброе время суток. Уважаемые форумчане.

Использую в программе рисование
jpg.Draw(PB.Canvas.Handle,0,0);
но тогда остаётся белая рамка рисунок "не правильный квадрат". Рисунок у меня сейчас в двух формат есть bmp и jpg.
При использовании KOLPng;
можно рисовать и делать прозрачным фон рисунка.
png2.DrawTransparent(PBox.Canvas.Handle, 665, 397, png2.Width, png2.Height, $DC7E5A );

Может есть другие варианты обойти этот момент без использования KOLPng?


QAZ   (24.08.11 21:46[1]

где связь между жпег и прозрачно?


rdnks   (25.08.11 00:11[2]

в джпеге нет альфа-канала вроде, но если с заменой цвета, качество - высокое, то можно так:

Jpеg.bitmap.DrawTransperent(dc, x, y, $ff00ff)

Результат будет фиговый, так как джпег не lossless формат :( лучше битмап, либо png.


rdnks   (25.08.11 00:20[3]

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


RusSun ©   (25.08.11 04:24[4]


> где связь между жпег и прозрачно?

Связи нет. Но может есть варианты как сделать.
> Jpеg.bitmap.DrawTransperent(dc, x, y, $ff00ff)
>

попробую так. )


RusSun ©   (25.08.11 04:32[5]

Во общем так нельзя сделать. Jpеg.bitmap.DrawTransperent(dc, x, y, $ff00ff) буду использовать KOLPng; Всем спасибо.


RusSun ©   (25.08.11 07:45[6]


> остаётся белая рамка рисунок "не правильный квадрат"

Всё просто. Надо просто изменить рисунок чтобы окантовка была того же цвета,
что и канва на которую рисуешь.

> QAZ   (24.08.11 21:46) [1]
>
> где связь между жпег и прозрачно?

+1 пока шел на работу понял что не так. Спасибо.


QAZ   (25.08.11 11:14[7]


> Всё просто. Надо просто изменить рисунок чтобы окантовка
> была того же цвета,
> что и канва на которую рисуешь.

в таком случае цвет канвы должен задаваца строго в ручную ибо "цвета"-константы типа clBtnFace,clWindow и т.д. зависят от настроек винды


rdnks   (25.08.11 13:47[8]

>Во общем так нельзя сделать. J p е g . b i t m a p . D r a w T r a n s p e r e n t ( d c , x , y , $ f f 0 0 f f )

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


RusSun ©   (25.08.11 14:08[9]


> > Всё просто. Надо просто изменить рисунок чтобы окантовка
> > была того же цвета,
> > что и канва на которую рисуешь.
>
> в таком случае цвет канвы должен задаваца строго в ручную
> ибо "цвета"-константы типа clBtnFace,clWindow и т.д. зависят
> от настроек винды
>

Хорошо. Так и сделаю.)


RusSun ©   (25.08.11 14:10[10]


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

Это и есть не очень хорошо.

> Результат будет фиговый


rdnks   (25.08.11 14:52[11]

собственно вот, пояснять нечего.

+++++
program test1;

uses KOL, JpegObj;

procedure Click1(Dummy, Sender: PObj);
var
 p : PJpeg;
 b : PBitmap;
 s : PStream;
 lineX, lineY, sx, sy: integer;
begin
p := NewJpeg;
p.LoadFromFile('c:\1.jpg');
s := NewMemoryStream;
p.Bitmap.SaveToStream(s);
s.Position := 0;
b := NewBitmap(0, 0);
b.LoadFromStream(s);
Free_And_Nil(s);
sx := b.Width;
sy := b.Height;
for lineY := 0 to sy do begin
 for lineX := 0 to sx do begin
   if b.DIBPixels[lineX, lineY] > $F0F0F0 then b.DIBPixels[lineX, lineY] := $FFFFFF;
   end;
 end;
b.DrawTransparent(Applet.Canvas.Handle, 0, 0, $FFFFFF);
end;

begin
 Applet := NewForm(nil, 'test1').SetSize(400, 200);
 with NewButton(Applet, 'load & draw')^ do begin
   Width := 100;
   Height := 20;
   Left := Applet.ClientWidth - Width;
   Top := Applet.ClientHeight - Height;
   OnClick := TOnEvent(MakeMethod(nil, @Click1));
   end;
 Run(Applet);
end.


RusSun ©   (25.08.11 16:37[12]

У меня av на
function _GetDIBPixelsTrueColor( Bmp: PBitmap; X, Y: Integer ): TColor;
asm
       PUSH     EBX
       XCHG     EBX, EAX
       PUSH     EDX
       MOV      EAX, [EBX].TBitmap.fScanLineDelta
       IMUL     ECX
       XCHG     ECX, EAX
       POP      EDX
       MOV      EAX, [EBX].TBitmap.fBytesPerPixel
       MUL      EDX
       ADD      EAX, [EBX].TBitmap.fScanLine0
    ->   MOV      EAX, [EAX+ECX]

Можно взглянуть какой рисунок ты загружаешь?


RusSun ©   (25.08.11 16:53[13]

Влияние оказывает размер рисунка.


rdnks   (25.08.11 17:30[14]

_http://btdompost.hop.ru/tmp/1.jpg

А если заменить DIBPixels на Pixels? Он вроде медленней цвет получает.


RusSun ©   (25.08.11 20:35[15]

DIBPixels имеет ограничение по размеру 366x445 больше идёт ошибка Runtime error 216 at 00406652.
Не имеет ограничения по Pixels ( долгое время рисования)
У меня не такое большое изображение так что попробую как вариант.
Большое спасибо:)


QAZ   (25.08.11 21:58[16]

понятно конечно что фигней маитесь,но цель вообще какая? положить картинку на панельку??


rdnks   (01.09.11 18:19[17]

насчет картинки на панели. Тоже столкнулся с такой проблемой на днях. Был в проге AboutBox,  в нем картинка fallout pip-boy, титры, музыка, всё как полагается. Единственное что смущало - разбухшее приложение. Jpeg-изображение 280х280 25кб + обжекты самого джпега фигова туча кб, даже не засекал. Семпл - 6 кб и уфмод для проигрывания семпла 8кб. Явно что только изображение в экзешнике мусор создает. Почитал книгу кол, что там по поводу битмапов написано и понял, что дурак) TBitmap умеет загружать rle-сжатые изображения. Вооружился пайнтом, эксэнвьювером и подогнал изображение в 16 цветный битмап. Итого - 8кб. Без лишних обжектов. Чтобы его рисовать с прозрачностью - лишь на его основе маску изготовить и из 4битного в 32битное перебить. Благо всё придумали уже и эти методы есть в кол.


QAZ   (02.09.11 10:44[18]


> Явно что только изображение в экзешнике мусор создает

т.е. музыка с плеером в абауте за мусор не считается? типа наиважнейшая функция всей проги ?


rdnks   (05.09.11 23:31[19]

>т.е. музыка с плеером в абауте за
мусор не считается? типа
наиважнейшая функция всей
проги ?

Может и не наиважнейшая функция, но явно не мусор. Как любитель трекерной музыки я получаю эстетическое удовольствие вшивая их туда. Если кого-то это не устраивает - не стоит тогда этой функцией и пользоваться ("о программе"). И вы явно неправильно толкуете мои сообщения. Поставлена задача - сделать эбаутбокс с таким-то изображением и такой-то музыкой. Есть два решения - с jpeg и без оного. Разница в конечном итоге и есть мусор. Так более понято?


MTsv DN   (07.09.11 11:37[20]

А что форматов больше нет? GIF чем не устраивает?

З.Ы. Хотя, в общем, согласен с QAZ...


rdnks   (07.09.11 19:56[21]

Изображение 280x280 4bit
Функции - NewXXX, LoadFromStream, Draw


Формат/Размер кода/Размер данных/Итого
______________________________________________
Bmp     |  2 560  | 39 318  | 41 878   | lossless
BmpRle  |  3 584  |  7 708  | 11 292   | lossless
Gif     | 21 204  |  5 233  | 26 437   | 8bit only
Png     | 32 768  |  3 365  | 36 133   | lossless
Jpeg    | 56 320  | 22 886  | 79 206   |

Естественно рассматривался конкретный случай.


Дмитрий К ©   (07.09.11 20:29[22]


> rdnks

Интересно, с BIS http://kolmck.net/Components/graphics/bis_compress_images.zip что получится? Если не затруднит.


rdnks   (07.09.11 22:34[23]


Bis     | 26 112  |  4 675  | 30 787   |

В исходниках написано что легко заменить ZLib на любой другой декомпрессор, видимо можно выиграть если использовать DIUcl, он компактней вроде. Выигрыш по всей видимости будет, если в программе использовать эту компрессию и для других целей, например, если использовать ZLib в протоколе над Http и прочее.


QAZ   (07.09.11 22:49[24]


> rdnks   (07.09.11 19:56) [21]

а как можно из бмп 39 318 получить жпег 22 886 ? чисто теоретически :)


rdnks   (07.09.11 22:50[25]

Очень просто. 39 318 битмап 4-х битный. Жпег формирует из него 24 или 32 битную карту уже, которую и сжимает ;)


rdnks   (07.09.11 23:06[26]

Извиняюсь за даблпостинг, вот отчет, который формирует Jedi

Name       Size Group             Package
-------- ------ ----------------- -------
bis       2 692 (CODE+ICODE+DATA)
err       3 415 (CODE+ICODE+DATA)
JpegObj  52 352 (CODE+ICODE+DATA)
KOL      13 215 (CODE+ICODE+DATA)
KOLadd      372 (CODE+ICODE+DATA)
KolGif    9 472 (CODE+ICODE+DATA)
KOLPng   12 960 (CODE+ICODE+DATA)
KolZLib  17 656 (CODE+ICODE+DATA)
Messages     56 (CODE+ICODE+DATA)
Mmx         341 (CODE+ICODE+DATA)
Windows     600 (CODE+ICODE+DATA)

Dependences
bis     : windows, kol, koladd, kolzlib;
JpegObj : windows, KOL, err;
KolGif  : windows, KOL, err;
KOLPng  : Windows, KOL, KOLZlib, Mmx;


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо