Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Одновременная работа TrackBar по изменению изображения. (http://forum.oszone.net/showthread.php?t=222541)

kotkkn 09-12-2011 18:15 1812296

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

lxa85 11-12-2011 18:14 1813333

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

lxa85 12-12-2011 00:18 1813547

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

kotkkn 12-12-2011 10:48 1813650

lxa85, сделаю!

kotkkn 13-12-2011 10:58 1814223

Переписал все и добавил объяснения:
Код:

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 сама по себе - то они друг друга взаимоисключают. Нужно их подружить. Извините, если с терминологией проблемы - всего полтора месяца учусь. Исходники вышлю если надо.

Verholom 13-12-2011 12:33 1814280

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


Время: 06:58.

Время: 06:58.
© OSzone.net 2001-