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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2011, 11:01   #1
werrey
Форумчанин
 
Регистрация: 01.02.2011
Сообщений: 105
По умолчанию Как убрать мерцание при изменении яркости в Image

Здравствуйте.
В нижеприведённом примере прозрачная картинка(png) лежит поверх Image, в котором регулируется изменение яркости.
При изменении яркости Image, происходит мерцание картинки(png),лежащей поверх основной.
Как это можно исправить?

Код:
Код:
Unit Unit1;

 Interface

 Uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
       ExtCtrls, StdCtrls, ComCtrls, pngimage;

 Type
  TForm1 = Class(TForm)
    Label1: TLabel;
    OrigImage: TImage;
    Label2: TLabel;
    DestImage: TImage;
    TrackBar1: TTrackBar;
    Label3: TLabel;
    ValueLbl: TLabel;
    Image1: TImage;
    Procedure FormCreate(Sender: TObject);
    Procedure TrackBar1Change(Sender: TObject);
  End;

 Var Form1 :TForm1;

 Const MaxPixelCount   =  32768;

 Type
    pRGBArray  =  ^TRGBArray;
    TRGBArray  =  ARRAY[0..MaxPixelCount-1] OF TRGBTriple;

 function Min(a, b: integer): integer;
 function Max(a, b: integer): integer;

 Implementation



 {$R *.DFM}

 Procedure TForm1.FormCreate(Sender: TObject);
  Begin
   OrigImage.Picture.LoadFromFile('1.bmp');
   DestImage.Picture.LoadFromFile('1.bmp');
    Image1.Picture.LoadFromFile('2.png');

   OrigImage.Picture.Bitmap.PixelFormat := pf24bit;
   DestImage.Picture.Bitmap.PixelFormat := pf24bit;

   TrackBar1.Position := 0;
   ValueLbl.Caption := '0'
 End;

 Procedure TForm1.TrackBar1Change(Sender: TObject);
  Var      i, j, value :integer;
      OrigRow, DestRow :pRGBArray;
  Begin
    // get brightness increment value
    value := TTrackBar(Sender).Position;

   if value <= 0 Then ValueLbl.Caption := IntToStr(value)
   Else ValueLbl.Caption := Format('+%d', [value]);

   // for each row of pixels
   For i := 0 to OrigImage.Picture.Height - 1 Do
    Begin
     OrigRow := OrigImage.Picture.Bitmap.ScanLine[i];
     DestRow := DestImage.Picture.Bitmap.ScanLine[i];
     // for each pixel in row
     For j := 0 to OrigImage.Picture.Width - 1 Do
      Begin
        //add brightness value to pixel's RGB values
        If value > 0 Then
         Begin
          // RGB values must be less than 256
          DestRow[j].rgbtRed := Min(255, OrigRow[j].rgbtRed + value);
          DestRow[j].rgbtGreen := Min(255, OrigRow[j].rgbtGreen + value);
          DestRow[j].rgbtBlue := Min(255, OrigRow[j].rgbtBlue + value);
         End
         Else
          Begin
           // RGB values must be greater or equal than 0
           DestRow[j].rgbtRed := Max(0, OrigRow[j].rgbtRed + value);
           DestRow[j].rgbtGreen := Max(0, OrigRow[j].rgbtGreen + value);
           DestRow[j].rgbtBlue := Max(0, OrigRow[j].rgbtBlue + value);
          End;
         End;
      End;

      DestImage.Repaint;
 End;

 Function Min(a, b: integer): integer;
  Begin
   if a < b Then result := a
   Else result := b;
 End;

 Function Max(a, b: integer): integer;
  Begin
   If a > b Then result := a
   Else result := b;
 End;

End.
Пример, в котором можно увидеть мерцание, при изменении яркости:
Вложения
Тип файла: rar Яркость в Image.rar (459.1 Кб, 34 просмотров)
werrey вне форума Ответить с цитированием
Старый 17.09.2011, 11:32   #2
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Попробуй поставить свойство DoubleBuffered = True. Вообще, подобная тема много раз обсуждалась.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 17.09.2011, 11:37   #3
werrey
Форумчанин
 
Регистрация: 01.02.2011
Сообщений: 105
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
Попробуй поставить свойство DoubleBuffered = True. Вообще, подобная тема много раз обсуждалась.
Это не помогает, Вы посмотрите пожалуйста скомпилированный проект, там если ползунком менять яркость, то происходит мерцание наложенной картинки.

Вопрос не решен.
werrey вне форума Ответить с цитированием
Старый 22.10.2011, 01:44   #4
voronuk
 
Регистрация: 12.05.2011
Сообщений: 7
По умолчанию

Не удержался... Не юзайте Repaint, рано или поздно наступите на грабли, юзайте Invalidate (извините что не по теме, в остальном код почти верный, молодцы что юзаете Scanline). Мерцание происходит из за: Image1.Picture.LoadFromFile('2.png' ) - Image1 винда перерисовывает самостоятельно, без Вашего участия - отселя и мигание.
Чтоб не мигало: 2.png-> во временный битмап- > изменили фон + наложили на фон битмап 2.png -> отобразили.

Последний раз редактировалось voronuk; 22.10.2011 в 02:00.
voronuk вне форума Ответить с цитированием
Старый 22.10.2011, 12:54   #5
werrey
Форумчанин
 
Регистрация: 01.02.2011
Сообщений: 105
По умолчанию

Цитата:
Сообщение от voronuk Посмотреть сообщение
Не удержался... Не юзайте Repaint, рано или поздно наступите на грабли, юзайте Invalidate (извините что не по теме, в остальном код почти верный, молодцы что юзаете Scanline). Мерцание происходит из за: Image1.Picture.LoadFromFile('2.png' ) - Image1 винда перерисовывает самостоятельно, без Вашего участия - отселя и мигание.
Чтоб не мигало: 2.png-> во временный битмап- > изменили фон + наложили на фон битмап 2.png -> отобразили.
Спасибо, а как это реализовать, можно по подробней?
werrey вне форума Ответить с цитированием
Старый 22.10.2011, 14:01   #6
GreyScall
Пользователь
 
Аватар для GreyScall
 
Регистрация: 01.01.2011
Сообщений: 29
Лампочка

Цитата:
Сообщение от voronuk Посмотреть сообщение
Не юзайте Repaint, рано или поздно наступите на грабли, юзайте Invalidate
хм... И который же Invalidate() Вы имели ввиду..? TWinControl.Invalidate() или Windows.InvalidateRect() ?
Впрочем не важно... Посмотрите реализацию Repaint() - оно использует и то и то...
Цитата:
Сообщение от voronuk Посмотреть сообщение
Image1 винда перерисовывает самостоятельно, без Вашего участия - отселя и мигание.
Не совсем... TImage это не Static-окно, а так сказать "рисованный" компонент VCL... Его отрисовкой занимается сама VCL...
Цитата:
Сообщение от voronuk Посмотреть сообщение
Чтоб не мигало: 2.png-> во временный битмап- > изменили фон + наложили на фон битмап 2.png -> отобразили.
Примерно это и делает DoubleBuffered...
Цитата:
Сообщение от werrey Посмотреть сообщение
Цитата:
Сообщение от artemavd Посмотреть сообщение
Попробуй поставить свойство DoubleBuffered = True. Вообще, подобная тема много раз обсуждалась.
Это не помогает, Вы посмотрите пожалуйста скомпилированный проект ...
Ну во-первых у Вас там как раз нет "DoubleBuffered:=True;" (оно должно быть в FormCreate()), а во вторых нужно делать не "DestImage.Repaint();", а просто "Repaint();"...

В остальное не всматривался...
Regards, GreyScall.

Последний раз редактировалось GreyScall; 22.10.2011 в 14:09. Причина: Досадная опечатка :(
GreyScall вне форума Ответить с цитированием
Старый 23.10.2011, 13:26   #7
voronuk
 
Регистрация: 12.05.2011
Сообщений: 7
По умолчанию

Цитата:
Спасибо, а как это реализовать, можно по подробней?
DestImage.Picture.Bitmap.Canvas.Dra w(0,0,Image1.Picture.Graphic);

+ Поставте DestImage на панель
+ Поставте свойство DestImage.Stretch в false (если оно Вам ненано)

Подкорректированный код в аттаче
Вложения
Тип файла: zip Яркость в Image2.zip (346.5 Кб, 45 просмотров)
voronuk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мерцание при перетаскивание Image Harikolo Мультимедиа в Delphi 3 17.02.2011 00:16
Убрать Мерцание при движени объектов Vervolf Общие вопросы Delphi 10 18.01.2011 23:47
ProgressBar - как убрать мерцание Dux Компоненты Delphi 1 20.09.2010 07:25
как убрать мерцание из Image'a? Sergeu Мультимедиа в Delphi 6 16.05.2009 08:57
Мерцание окна при изменении размера zaqer Win Api 2 30.07.2008 23:39