Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.11.2012, 23:06
Аватар для Algplux
Algplux Algplux вне форума
Прохожий
 
Регистрация: 03.11.2012
Адрес: Березники, Пермский край
Сообщения: 20
Версия Delphi: 7
Репутация: 10
По умолчанию Нужна помощь по курсовой работе

Всем привет, ребят, мне очень нужна помощь по курсовой работе.
Тема:
Разработать компонент для редактирования графических файлов, реализовать функции осветления и затемнения, установки прозрачности, поворота на заданный угол, пошаговую отмену последнего действия.
Обладаю очень малым количеством информации по теме, и даже не представляю с чего начать. Глянул как создавать компоненты, я так понял нужен компонент на основе Timage, но что делать дальше, не пойму, может кто поделится интересными ссылками на статьи или что-то подобное, что может помочь мне в написании курсовой.
Буду рад, любой информации по теме.
Спасибо.
Ответить с цитированием
  #2  
Старый 05.11.2012, 00:26
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Можешь для начала заглянуть сюда, найдёшь много интересного (и не очень ) по работе с графикой.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 05.11.2012, 01:04
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Цитата:
Сообщение от Algplux
Всем привет, ребят, мне очень нужна помощь по курсовой работе.
Тема:
Разработать компонент для редактирования графических файлов, реализовать функции осветления и затемнения, установки прозрачности, поворота на заданный угол, пошаговую отмену последнего действия.
Обладаю очень малым количеством информации по теме, и даже не представляю с чего начать. Глянул как создавать компоненты, я так понял нужен компонент на основе Timage, но что делать дальше, не пойму, может кто поделится интересными ссылками на статьи или что-то подобное, что может помочь мне в написании курсовой.
Буду рад, любой информации по теме.
Спасибо.
>offtop
Как-то на компонент не тянет. Слишком "просто" все Редактирование, спец. функции. Лучше Paint'а в Ole запихни, попроще будет .


Лучше задавай вопросы по порядку, так легче будет что-нибудь объяснить, а то так сразу хоть готовый компонент пиши и выкладывай.
Ответить с цитированием
  #4  
Старый 05.11.2012, 18:14
Аватар для Algplux
Algplux Algplux вне форума
Прохожий
 
Регистрация: 03.11.2012
Адрес: Березники, Пермский край
Сообщения: 20
Версия Delphi: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от YVitaliy
>offtop
Как-то на компонент не тянет. Слишком "просто" все Редактирование, спец. функции. Лучше Paint'а в Ole запихни, попроще будет .


Лучше задавай вопросы по порядку, так легче будет что-нибудь объяснить, а то так сразу хоть готовый компонент пиши и выкладывай.
Ну я думаю нужно начать с того как создавать компонент, это вроде получилось. Что нужно писать в компоненте? Вот эти процедуры обработки изображения? А как проверить, работает или нет? И я не просил готового кода, статьи, книги, подобные примеры, вот что больше интересует.
Вопросы:
1) Что писать внутри компонента? Желательно привести пример люого компонента обработки изображения.
2) Как проверить то что я написал?
Ответить с цитированием
  #5  
Старый 05.11.2012, 18:31
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от Algplux
1) Что писать внутри компонента? Желательно привести пример люого компонента обработки изображения.
2) Как проверить то что я написал?
1. классический набор: конструктор, деструктор, поля, свойства, методы
2. в runtime создать объект
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 05.11.2012, 20:54
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Цитата:
Сообщение от Algplux
1) Что писать внутри компонента? Желательно привести пример люого компонента обработки изображения.
2) Как проверить то что я написал?
1. Собственно то что советовал NumLock,соответственно, среди методов должны быть те, которые и "обрабатывают" изображение.

2. Я, например, при редактировании "уже готового" компонента довольствуюсь ctrl+shift+S,project- "Build all projects", "Compile all projects", run - изменения вступают в силу (правда не всегда, но как правило). Создаешъ самый примитивный компонент, устанавливаешь его в Делфи, бросаешь на форму а потом редактируешь. У меня на Delphi7 так катит.
Приду сработыприведупример какого-нибудь компонента.
Ответить с цитированием
  #7  
Старый 06.11.2012, 13:57
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Вот например таков компонент на основе TGraphicControl - умеет загружать битмапы и вращать на определенный угол. Понятное дело, недоделанный
Но по сути, должно быть что-то такое.
Вложения
Тип файла: rar RTmage.rar (8.9 Кбайт, 12 просмотров)
Ответить с цитированием
  #8  
Старый 06.11.2012, 21:44
Аватар для Algplux
Algplux Algplux вне форума
Прохожий
 
Регистрация: 03.11.2012
Адрес: Березники, Пермский край
Сообщения: 20
Версия Delphi: 7
Репутация: 10
По умолчанию

Давайте лучше начнём с чего попроще, установка прозрачности.
Я тут на сайте нашел:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
    bm : TBitmap;
    il : TImageList;
begin
    bm := TBitmap.Create;
    bm.LoadFromFile('C:\DownLoad\TEST.BMP');
    il := TImageList.CreateSize(bm.Width,bm.Height);
    il.DrawingStyle := dsTransparent;
    il.Masked := true;
    il.AddMasked(bm, clRed);
    il.Draw(Form1.Canvas, 0, 0, 0);
    bm.Free;
    il.Free;
end;
Админ: Пользуемся тегами при оформлении кода!

Вот думаю как теперь под компонент переделать.

Последний раз редактировалось Admin, 06.11.2012 в 22:52.
Ответить с цитированием
  #9  
Старый 09.11.2012, 01:23
Аватар для Algplux
Algplux Algplux вне форума
Прохожий
 
Регистрация: 03.11.2012
Адрес: Березники, Пермский край
Сообщения: 20
Версия Delphi: 7
Репутация: 10
По умолчанию

В общем решил пока так пока написать, не в компонент, просто в приложение, потом в компонент перенесу.
Ответить с цитированием
  #10  
Старый 21.12.2012, 19:28
Аватар для Algplux
Algplux Algplux вне форума
Прохожий
 
Регистрация: 03.11.2012
Адрес: Березники, Пермский край
Сообщения: 20
Версия Delphi: 7
Репутация: 10
По умолчанию

Ребята, извините что пропал. Тема актуальна ещё. Из за работы времени на курсач совсем не было. Решил с компонентом пока не замарачиваться, Всё просто в программе написать. Сейчас ищу нужные функции. Парочка уже есть:

Код:
function ByteLimit(Value: Integer): Byte;
begin
 if Value < 0 then
   Result := 0
 else if Value > 255 then
   Result := 255
 else
   Result := Value;
end;

procedure LightDark24Bit(Bmp: TBitmap; Value: Integer);
{
Сделать светлее - Value > 0
Cделать темнее  - Value < 0
}
var
P               : PByteArray;
X, Y            : Integer;
BytesInScanLine : Integer;
DIB             : TDIBSection;
begin
if (Bmp.PixelFormat = pf24Bit) and
   (GetObject(Bmp.Handle, SizeOf(DIB), @DIB) = SizeOf(DIB)) and
   (DIB.dsBmih.biHeight > 0) and (Value <> 0) then
begin
  BytesInScanLine := (((DIB.dsBmih.biWidth * DIB.dsBmih.biBitCount) + 31) and not 31) div 8;
  P := DIB.dsBm.bmBits;
  for Y := DIB.dsBmih.biHeight - 1 downto 0 do
  begin
    for X := 0 to (DIB.dsBmih.biWidth - 1) * 3 do
      P[X] := ByteLimit(P[X] + Value);
    Integer(P) := Integer(P) + BytesInScanLine;
  end;
end;
end;
Как мне её реализовать?

Последний раз редактировалось Algplux, 21.12.2012 в 19:31.
Ответить с цитированием
  #11  
Старый 21.12.2012, 21:33
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Несколько советов.
1. Если все-равно надо будет делать компонент, то проще сразу компонент и делать. Компонент отличается от простого класса только тем, что имеет процедуру регистрации (которая, кстати, для работы самого компонента не нужна). Ну и еще конструктор имеет стандартную сигнатуру. Обычно, при написании компонента, создается новый проект, в котором в OnCreate твой компонент динамически создается и настраивается (первоначальные настройки, которые в обычном режиме задаются через Object Inspector).
2. Вот конкретно в твоем случае я бы наследовался бы от TPaintBox (или TCustomPaintBox, что, наверное, лучше, т.к. можно будет опубликовать только нужные свойства/методы), в своем компоненте завел бы поле типа TBitmap (для хранения изображения), ну а дальше все по списку (все методы будут работать с этим полем).
Ответить с цитированием
  #12  
Старый 22.12.2012, 19:42
Аватар для Algplux
Algplux Algplux вне форума
Прохожий
 
Регистрация: 03.11.2012
Адрес: Березники, Пермский край
Сообщения: 20
Версия Delphi: 7
Репутация: 10
По умолчанию

Ладно. Послушаю совета.
Код:
unit MyImage;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, jpeg, ExtDlgs, Buttons, Spin, Math;

type
  MyImage = class(TImage)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    constructor Create(AOwner: TComponent); override;
    procedure Turn (X:Integer; Y:String);   //поворот
  published
    { Published declarations }
  end;

var
  StartBitmap: TBitmap;
  ImageLeft,ImageTop,OldHeight,OldWidth: integer;
  NewWidths,NewHeights: array [0..90] of extended; //массив всех возможных размеров
  OBs,OHs,aBOHs: array of array of extended; //параметры для расчёта координат
  d: array [0..90] of array [0..1] of integer; //сдвиги
  AnglesRad: array [0..360] of extended; //углы в радианах
  //максимальные размеры и радиус окружности, в которую со 100% попадают точки изображения
  MaxWidth,MaxHeight,MaxRadius: extended;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MyComponents', [MyImage]);
end;

constructor MyImage.Create(AOwner: TComponent);
begin
  inherited Create(AOwner); //Вызываем унаследованный конструктор
end;

procedure TMyImage.Turn (X:Integer; Y:String);
var
  bm: TBitmap;
  j,k,Angle,RotateAngle,NewX,NewY: integer;
  OB,OH,aBOH,dx,dy,NewHeight,NewWidth: extended;
begin
  Center:=true;
  //берем значение угла из элемента на форме
  Angle:=X;
  //приводим его к значению от 0 до 360
  if Angle<0 then Angle:=(Angle mod 360)+360
  else Angle:=Angle mod 360;
  //приводим к значению от 0 до 90 (для вычисления новых размеров угол 
  // должен быть в этом интервале
  if Angle<=180 then begin
    RotateAngle:=Angle mod 180;
    if RotateAngle>90 then RotateAngle:=180-RotateAngle;
  end
  else begin
    RotateAngle:=abs(Angle-360);
    if RotateAngle>90 then RotateAngle:=180-RotateAngle;
  end;
  //новые размеры
  NewWidth:=2*(sqrt(power(StartBitmap.Width,2)+power(StartBitmap.Height,2))/2*sin(arctan(StartBitmap.Width/StartBitmap.Height)+RotateAngle*pi/180));
  NewHeight:=2*(sqrt(power(StartBitmap.Width,2)+power(StartBitmap.Height,2))/2*sin(arctan(StartBitmap.Height/StartBitmap.Width)+RotateAngle*pi/180));
  //сдвиги
  dx:=(NewWidth-OldWidth)/2;
  dy:=(NewHeight-OldHeight)/2;
  //сдвигаем координаты элемента
  Left:=ImageLeft-round(dx);
  Top:=ImageTop-round(dy);

  Width:=round(NewWidth);
  Height:=round(NewHeight);

  bm:=TBitmap.Create;
  bm.Width:=round(NewWidth);
  bm.Height:=round(NewHeight);
  bm.PixelFormat:=pf32bit;

  NewWidth:=(NewWidth-1);
  NewHeight:=(NewHeight-1);

  for j:=0 to round(NewWidth) do begin
    for k:=0 to round(NewHeight) do begin
      OB:=sqrt(power(NewWidth/2-(j),2)+
      power(NewHeight/2-(k),2));
      OH:=NewWidth/2-(j);
      if (OB<>0) then aBOH:=arccos(abs(OH)/OB) else aBOH:=0;
      if ((k>=NewHeight/2) and (j<NewWidth/2)) or
      ((k<NewHeight/2) and (j>=NewWidth/2)) then
        aBOH:=-aBOH;
      if OH>0 then begin
        //новые координаты для четвертей 2 и 3
        NewX:=round(NewWidth/2 - cos(aBOH+Angle*pi/180)*OB-dx);
        NewY:=round(NewHeight/2 - sin(aBOH+Angle*pi/180)*OB-dy);
      end
      else begin
        //новые координаты для четвертей 1 и 4
        NewX:=round(NewWidth/2 - cos(aBOH+Angle*pi/180+pi)*OB-dx);
        NewY:=round(NewHeight/2 - sin(aBOH+Angle*pi/180+pi)*OB-dy);
      end;
      //если полученные координаты попадают в старое изображение...
      if (NewX>=0) and (NewY>=0) and (NewX<=OldWidth-1) and (NewY<=OldHeight-1) then
      //...берем из него точку
      bm.Canvas.Pixels[j,k]:=StartBitmap.Canvas.Pixels[NewX,NewY]
      else bm.Canvas.Pixels[j,k]:=$f5f5f5;
    end;
  end;
  //выводим результат
  Picture.Bitmap.Assign(bm);
  bm.Free;
end;

end.
Похоже на правду?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:57.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter