Конференция "KOL" » jpeg transparent [Delphi, Windows]
 
  • RusSun © (24.08.11 20:48) [0]
    Доброе время суток. Уважаемые форумчане.

    Использую в программе рисование
    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;

 
Конференция "KOL" » jpeg transparent [Delphi, Windows]
Есть новые Нет новых   [134430   +2][b:0.001][p:0.003]