Водяные знаки. Delphi

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by SultanOFF, 16 Apr 2010.

  1. SultanOFF

    SultanOFF Member

    Joined:
    4 Jun 2009
    Messages:
    156
    Likes Received:
    6
    Reputations:
    0
    Здравствуйте. Появтлась необходимость накладывать в своей проге водяной знак на картинку(JPG). Водяной знак также представляет из себя обычную картинку. Собственно исходник по наложению картинки на картинку Я нашел. Но там 1-ая картинка полностью накладывается на вторую(ну только с прозрачностью), а Мне нужно на определенный участок первой картинки. Вот код
    Code:
    var    
      bmp1, bmp2: TBitMap;    
      Blend: TBlendFunction;    
    begin    
      bmp1 := TBitMap.Create;    
      bmp2 := TBitMap.Create;    
      bmp1.LoadFromFile('C:\1.bmp'); // загружаем 1 битмап    
      bmp2.LoadFromFile('C:\2.bmp'); // и второй битмап    
      bmp1.PixelFormat := pf32bit; // переводим оба в 32 бит    
      bmp2.PixelFormat := pf32bit;    
      Blend.BlendOp := AC_SRC_OVER;
      Blend.BlendFlags := 0;    
      Blend.SourceConstantAlpha := 128; // прозрачность 50% (0 - 255)    
      Blend.AlphaFormat := AC_SRC_ALPHA; // либо = 0 (другой алгоритм)
      // накладываем битмап 2 на битмап 1. Результат в bmp1
      if Windows.AlphaBlend(bmp1.Canvas.Handle, 0, 0, bmp1.Width, bmp1.Height,    
                            bmp2.Canvas.Handle, 0, 0, bmp2.Width, bmp2.Height, Blend) then    
        Canvas.Draw(0, 0, bmp1) // рисуем результат на форме    
      else ShowMessage(IntToStr(GetLastError)); // или код ошибки, если наложить не удалось    
      bmp1.Free; bmp2.Free; // уничтожаем битмапы    
    end;
    Помогите пожалуйста :(
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    спрашивается: млять ты каким местом смотришь????????????????????????????????
    тебе случайно ничего не говорят эти цифры:
    if Windows.AlphaBlend(bmp1.Canvas.Handle, 0, 0, bmp1.Width, bmp1.Height, bmp2.Canvas.Handle, 0, 0, bmp2.Width, bmp2.Height, Blend) then

    Или впадлу глянуть в MSDN и увидеть
    Когда задаете подобные вопросы, вы хотябы ищите сначало ответы в инете или хоть чуть сами подумайте над ответом. Тем более что на 99% вопросов по WinAPI - в MSDN есть ответы. Влом канать? Ну тогда юзайте онлайн версию. Не знаете англ языка, ну так смотрите уже переведенный вариант или кормите гуглопереводчика.
     
    #2 slesh, 16 Apr 2010
    Last edited: 16 Apr 2010
  3. SultanOFF

    SultanOFF Member

    Joined:
    4 Jun 2009
    Messages:
    156
    Likes Received:
    6
    Reputations:
    0
    Slesh, простите Меня за такие глупые вопросы :( действительно про MSDN Я впервые узнал.. впредь обещаю быть более внимательным.. Вот Я сделал так
    Code:
    Windows.AlphaBlend(bmp1.Canvas.Handle, bmp1.Width-bmp2.Width, bmp1.Height- bmp2.Height, bmp1.Width, bmp1.Height,
                            bmp2.Canvas.Handle, 0, 0, bmp2.Width,  bmp2.Height, Blend)
    по Моим суждениям вторая картинка должна появится в правом нижнем углу. Однако картинки вообще не видно.
     
  4. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    А зачем понадобилось добавить водный знак? Опытному человеку не очень сложно будет обойти такую реализацию (скажем, сделать скриншот проги, на котором должен быть ватермарк, но его не будет).
     
  5. SultanOFF

    SultanOFF Member

    Joined:
    4 Jun 2009
    Messages:
    156
    Likes Received:
    6
    Reputations:
    0
    Мне на скриншоты нужно накладывать водяной знак, этой прогой особо опытные люди не будут пользоваться :)
     
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Code:
      if Windows.AlphaBlend(
        bmp1.Canvas.Handle, // главная картинка
        bmp1.Width - bmp2.Width, // место куда начнет выводиться вторая картинка по X
        bmp1.Height - bmp2.Height, // место куда начнет выводиться вторая картинка по Y
        bmp2.Width, // сколько будет выводиться вторая картинка по X
        bmp2.Height,  // сколько будет выводиться вторая картинка по Y
        bmp2.Canvas.Handle, // накладываемая картинка
        0, // откуда наложить X
        0, // откуда наложить Y
        bmp2.Width, // сколько наложить по X
        bmp2.Height, // сколько наложить по Y
        Blend) then
    
    Выражаясь простым языком команда принимает значения:
    Положение и размер региона куда впихиваются данные и положения и размер региона впихиваемых данных. Если первый меньше второго, то автоматически картинка уменьшится (масштаб станет меньше), если первый больше второго, то наоборот увеличится. т.е. чтото типа изменение размера еще можно тут реализовать.

    AC_SRC_ALPHA - мешивание светов + прозрачность
    AC_SRC_OVER - смешивание цветов без использование прозрачности
     
    #6 slesh, 16 Apr 2010
    Last edited: 16 Apr 2010
  7. SultanOFF

    SultanOFF Member

    Joined:
    4 Jun 2009
    Messages:
    156
    Likes Received:
    6
    Reputations:
    0
    все, спасибо большое Slesh. Теперь постараюсь меньше задавать подобные вопросы. :)