Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Одновременная работа TrackBar по изменению изображения.

Ответить
Настройки темы
Delphi - Одновременная работа TrackBar по изменению изображения.

Новый участник


Сообщения: 15
Благодарности: 0

Профиль | Отправить PM | Цитировать


Добрый день! Делаю программу по обработке фото. На начальном этапе столкнулся с проблемой невозможности одновременной работы TrackBar при регулировке яркости, контрастности и цветов. Отрегулировав что-то одно, при переключении на другой TrackBar происходит сброс изображения до первоначального уровня. Подкинул сторонний компонент OrImage - яркость и контрастность регулируются в униссон - цвет - по прежнему нет. Если интересно выложу исходники и пришлю программу. Спасибо заранее. Есть еще много вопросов по программе, но это по мере решения.

Отправлено: 18:15, 09-12-2011

 

Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


kotkkn, без исходников - тяжеловато. Я склонен полагать, что где-то допущена логическая ошибка. Нужен проект + указание номера среды разработки.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 18:14, 11-12-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Получил исходники. Запустил программу.
kotkkn, я тебя умоляю, пиши комментарии! У тебя куча однотипных функций, прочитывать каждую - это жестоко. В следующих раз выдели проблемные места (функции) каким либо образом, чтобы весь исходник взад-вперед не листать.
kotkkn, ежик ты зеленый, имей уважение к читающим. За день и так глаза в кучу, так еще 5 разных файлов без объяснений. (project1.dpr... ага, уже лучше)
(исходники ...) Все. Не хочу.
kotkkn, Задание тебе:
Каждой кнопке дать нормальное название, а не Button123.
Привести в порядок код (расставить табуляцию и написать комментарии к сложным моментам, дать комментарии к каждой функции)
В следующий раз указывать файл и проблемную функцию. Всю ту кашу, что пока есть я еще посмотрю, может чего пойму. Все что я сказал - принять к сведению и исполнять. Исполнять в первую очередь для себя.
Удачи, жду исправленных текстов. И публикуй их сразу сюда. Я на форуме далеко не один, товарищи помогут, дельное что подскажут.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:18, 12-12-2011 | #3


Новый участник


Сообщения: 15
Благодарности: 0

Профиль | Отправить PM | Цитировать


lxa85, сделаю!

Отправлено: 10:48, 12-12-2011 | #4


Новый участник


Сообщения: 15
Благодарности: 0

Профиль | Отправить PM | Цитировать


Переписал все и добавил объяснения:
Код: Выделить весь код
unit foto;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Mask, ExtCtrls, ComCtrls, ExtDlgs, 
  jpeg, ImgList, DBCtrls, Math, Clipbrd, Spin, Buttons, OrImage, OrImageEditor;

type
  TForm1 = class(TForm)
    btnFileLoad: TButton;
    btnBumGlyan: TButton;
    btnBumMatt: TButton;
    btnSize10x15: TButton;
    btnSize15x21: TButton;
    btnSize20x30: TButton;
    btnStartAll: TButton;
    btnStopAll: TButton;
    btnPageDown: TButton;
    btnPageUp: TButton;
    btnSaveAll: TButton;
    btnExit: TButton;
    lblVarSize: TLabel;
    SavePictureDialog1: TSavePictureDialog;
    OpenPictureDialog1: TOpenPictureDialog;
    PutFile1: TEdit;
    GroupBox1: TGroupBox;
    CheckBox1: TCheckBox;
    lblNameBrightnessShort1: TLabel;
    lblVarBrightness: TLabel;
    lblNameBrightnessShort2: TLabel;
    GroupBox2: TGroupBox;
    lblNameContrastShort1: TLabel;
    lblVarContrast: TLabel;
    lblNameContrastShort2: TLabel;
    CheckBox2: TCheckBox;
    GroupBox3: TGroupBox;
    lblNameRedShort1: TLabel;
    lblVarRed: TLabel;
    lblNameRedShort2: TLabel;
    CheckBox3: TCheckBox;
    trbRedValue: TTrackBar;
    trbGreenValue: TTrackBar;
    trbBlueValue: TTrackBar;
    lblNameGreenShort2: TLabel;
    lblNameBlueShort2: TLabel;
    lblNameGreenShort1: TLabel;
    lblNameBlueShort1: TLabel;
    lblVarGreen: TLabel;
    lblVarBlue: TLabel;
    Bevel1: TBevel;
    Bevel2: TBevel;
    Bevel3: TBevel;
    Bevel4: TBevel;
    Bevel6: TBevel;
    SheetFile1: TSpinEdit;
    SheetFile2: TSpinEdit;
    SheetFile3: TSpinEdit;
    SheetFile4: TSpinEdit;
    SheetFile5: TSpinEdit;
    SheetFile6: TSpinEdit;
    PutFile2: TEdit;
    PutFile3: TEdit;
    PutFile4: TEdit;
    PutFile5: TEdit;
    PutFile6: TEdit;
    OrImage1: TOrImage;
    Bevel5: TBevel;
    OrImage2: TOrImage;
    OrImage3: TOrImage;
    OrImage4: TOrImage;
    OrImage5: TOrImage;
    OrImage6: TOrImage;
    trbBrightness: TTrackBar;
    trbContrast: TTrackBar;
    lblVarBum: TLabel;



    procedure btnFileLoadClick(Sender: TObject);
    procedure btnSaveAllClick(Sender: TObject);
    procedure btnExitClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure OrImageDblClick(Sender: TObject);
    procedure TrackBarBrightnessChange(Sender: TObject);
    procedure TrackBarContrastChange(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure OrImage1DblClick(Sender: TObject);
    procedure OrImage2DblClick(Sender: TObject);
    procedure OrImage3DblClick(Sender: TObject);
    procedure OrImage4DblClick(Sender: TObject);
    procedure OrImage5DblClick(Sender: TObject);
    procedure TrackBarChange(Sender: TObject);


    private
    { Private declarations }


    public
    { Public declarations }
    OrImage: TOrImage;
    procedure UpdateEffects;


  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

uses Unit2;

{$R *.dfm}

const strTrueORFalse: array[Boolean]of string = ('false','true');


 procedure TForm1.btnFileLoadClick(Sender: TObject);   //Загрузка файлов в каждый Image
  var
    q : integer;
  begin
  if (openpicturedialog1.Execute) and (openpicturedialog1.FileName <> '') then
    try
      for q := 0 to openpicturedialog1.Files.Count - 1 do
        case q of
          0:begin
                  OrImage1.Picture.LoadFromFile(openpicturedialog1.Files.Strings[q]);
                  OrImage1.PictureOriginal := OrImage1.Picture;
            end;
          1:begin
                  OrImage2.Picture.LoadFromFile(openpicturedialog1.Files.Strings[q]);
                  OrImage2.PictureOriginal := OrImage2.Picture;
            end;
          2:begin
                  OrImage3.Picture.LoadFromFile(openpicturedialog1.Files.Strings[q]);
                  OrImage3.PictureOriginal := OrImage3.Picture;
            end;
          3:begin
                  OrImage4.Picture.LoadFromFile(openpicturedialog1.Files.Strings[q]);
                  OrImage4.PictureOriginal := OrImage4.Picture;
            end;
          4:begin
                  OrImage5.Picture.LoadFromFile(openpicturedialog1.Files.Strings[q]);
                  OrImage5.PictureOriginal := OrImage5.Picture;
            end;
          5:begin
                  OrImage6.Picture.LoadFromFile(openpicturedialog1.Files.Strings[q]);
                  OrImage6.PictureOriginal := OrImage6.Picture;
            end;
        end;
    except
        ShowMessage('Ошибка!');
    end;

  end;



 procedure TForm1.formCreate(Sender: TObject);  //Определение нулевых позиций при старте
 begin
 lblVarBrightness.Caption := '0';
 lblVarContrast.Caption := '0';
 trbRedValue.Position := 0;
 lblVarRed.Caption := '0';
 trbGreenValue.Position := 0;
 lblVarGreen.Caption := '0';
 trbBlueValue.Position := 0;
 lblVarBlue.Caption := '0';
 end;


procedure TForm1.TrackBarChange(Sender: TObject);  //Регулировка по цветам
var i, j, k, l, m, n, o, p, e, f, r, t, g, h, RedValue, GreenValue, BlueValue : integer;
    OrigRow, DestRow: pRGBArray;        //Назначение переменных
begin
  RedValue := trbRedValue.Position;           //Присвоение переменным начальных значений TrackBar-ов
  GreenValue := trbGreenValue.Position;
  BlueValue := trbBlueValue.Position;

  if RedValue <= 0 then lblVarRed.Caption := IntToStr(RedValue)
  else lblVarRed.Caption := Format('+%d', [RedValue]);
  if GreenValue <= 0 then lblVarGreen.Caption := IntToStr(GreenValue)
  else lblVarGreen.Caption := Format('+%d', [GreenValue]);
  if BlueValue <= 0 then lblVarBlue.Caption := IntToStr(BlueValue)
  else lblVarBlue.Caption := Format('+%d', [BlueValue]);

  for i := 0 to OrImage1.Picture.Height - 1 do
  begin
    OrigRow := OrImage1.PictureOriginal.Bitmap.ScanLine[i];   //считывание изображения
    DestRow := OrImage1.Picture.Bitmap.ScanLine[i];
    for j := 0 to OrImage1.Picture.Width - 1 do
    begin                                                   //алгоритм изменения цветов
      if RedValue > 0 then
        DestRow[j].rgbtRed := Min(255, OrigRow[j].rgbtRed + RedValue)
      else
        DestRow[j].rgbtRed := Max(0, OrigRow[j].rgbtRed + RedValue);
      if GreenValue > 0 then
        DestRow[j].rgbtGreen := Min(255, OrigRow[j].rgbtGreen + GreenValue)
      else
        DestRow[j].rgbtGreen := Max(0, OrigRow[j].rgbtGreen + GreenValue);
      if BlueValue > 0 then
        DestRow[j].rgbtBlue := Min(255, OrigRow[j].rgbtBlue + BlueValue)
      else
        DestRow[j].rgbtBlue := Max(0, OrigRow[j].rgbtBlue + BlueValue);
    end;
  end;
    OrImage1.Repaint;     //перерисовка изображения
end;

procedure TForm1.UpdateEffects;     //Изменение яркости и контрастности
 begin
  if OrImage1<> nil then with OrImage1 do     //Задание начальных значений
  begin
    trbBrightness.Position:=PicBrightness;
    trbContrast.Position:=PicContrast;
  end;
 end;

 procedure TForm1.FormActivate(Sender: TObject);     //принудительное обновление эффекта яркости и контрастности
 begin
  if OrImage1<>nil then
  UpdateEffects;
 end;

 procedure TForm1.TrackBarBrightnessChange(Sender: TObject);  //Регулировка яркости
 begin
  if OrImage1=nil then Exit;
  OrImage1.PicBrightness:=trbBrightness.Position;
  lblVarBrightness.Caption:=' '+IntToStr(OrImage1.PicBrightness)+' ';

 end;

 procedure TForm1.TrackBarContrastChange(Sender: TObject);  //Регулировка контраста
 begin
  if OrImage1=nil then Exit;
  OrImage1.PicContrast:=trbContrast.Position;
  lblVarContrast.Caption:=' '+IntToStr(OrImage1.PicContrast)+' ';

 end;

 procedure TForm1.btnSaveAllClick(Sender: TObject);  //Сохранение файлов
 begin
 SavePictureDialog1.Execute
 end;

 procedure TForm1.btnExitClick(Sender: TObject);   //Выход из программы
 begin
 Close
 end;

 procedure TForm1.OrImageDblClick(Sender: TObject);    //Присвоение двойного нажатия на Image для открытия Form2 (коррекция красных глаз)
 begin
   ClipBoard.Clear;
   ClipBoard.Open;
   ClipBoard.Assign(OrImage1.Picture);
   ClipBoard.Close;
   Form2.Showmodal;
 end;
 procedure TForm1.OrImage1DblClick(Sender: TObject);
 begin
   ClipBoard.Clear;
   ClipBoard.Open;
   ClipBoard.Assign(OrImage2.Picture);
   ClipBoard.Close;
   Form2.Showmodal;
 end;
 procedure TForm1.OrImage2DblClick(Sender: TObject);
 begin
   ClipBoard.Clear;
   ClipBoard.Open;
   ClipBoard.Assign(OrImage3.Picture);
   ClipBoard.Close;
   Form2.Showmodal;
 end;
 procedure TForm1.OrImage3DblClick(Sender: TObject);
 begin
   ClipBoard.Clear;
   ClipBoard.Open;
   ClipBoard.Assign(OrImage4.Picture);
   ClipBoard.Close;
   Form2.Showmodal;
 end;
 procedure TForm1.OrImage4DblClick(Sender: TObject);
 begin
   ClipBoard.Clear;
   ClipBoard.Open;
   ClipBoard.Assign(OrImage5.Picture);
   ClipBoard.Close;
   Form2.Showmodal;
 end;
 procedure TForm1.OrImage5DblClick(Sender: TObject);
 begin
   ClipBoard.Clear;
   ClipBoard.Open;
   ClipBoard.Assign(OrImage6.Picture);
   ClipBoard.Close;
   Form2.Showmodal;
 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.
Проблема остается - так как яркость и контрастность в одной "связке" (компонент OrImage), а регулировка RGB сама по себе - то они друг друга взаимоисключают. Нужно их подружить. Извините, если с терминологией проблемы - всего полтора месяца учусь. Исходники вышлю если надо.

Отправлено: 10:58, 13-12-2011 | #5


Аватара для Verholom

Новый участник


Сообщения: 21
Благодарности: 2

Профиль | Отправить PM | Цитировать


Скорее всего Вы забываете обновлять изображение, которое показываете на экране. Копонента помнит старый рисунок, и отображает его. Хотя я противник использования всяких ЭУ: только прямая работа с байтами (диб-секция там, или еще как). Будет быстрее и картинка всегда будет актуальной

Отправлено: 12:33, 13-12-2011 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Одновременная работа TrackBar по изменению изображения.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Route/Bridge - Одновременная работа 2 ip-адресов ITSpec Сетевые технологии 4 06-03-2011 16:56
Одновременная работа цикла и программы ShogenOFF AutoIt 4 13-08-2010 22:48
Доступ - Одновременная работа в 2-х сетях. DmitryF Microsoft Windows 7 2 26-07-2010 13:31
одновременная работа монитора и телевизора altr Видеокарты 7 08-02-2010 18:48
одновременная работа (Remote Desktop)... minion Microsoft Windows 2000/XP 15 18-11-2006 23:07




 
Переход