|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Нужна помощь по курсовой работе
Всем привет, ребят, мне очень нужна помощь по курсовой работе.
Тема: Разработать компонент для редактирования графических файлов, реализовать функции осветления и затемнения, установки прозрачности, поворота на заданный угол, пошаговую отмену последнего действия. Обладаю очень малым количеством информации по теме, и даже не представляю с чего начать. Глянул как создавать компоненты, я так понял нужен компонент на основе Timage, но что делать дальше, не пойму, может кто поделится интересными ссылками на статьи или что-то подобное, что может помочь мне в написании курсовой. Буду рад, любой информации по теме. Спасибо. |
#3
|
||||
|
||||
Цитата:
Как-то на компонент не тянет. Слишком "просто" все Редактирование, спец. функции. Лучше Paint'а в Ole запихни, попроще будет . Лучше задавай вопросы по порядку, так легче будет что-нибудь объяснить, а то так сразу хоть готовый компонент пиши и выкладывай. |
#4
|
||||
|
||||
Цитата:
Вопросы: 1) Что писать внутри компонента? Желательно привести пример люого компонента обработки изображения. 2) Как проверить то что я написал? |
#5
|
||||
|
||||
Цитата:
2. в runtime создать объект Пишу программы за еду. __________________ |
#6
|
||||
|
||||
Цитата:
2. Я, например, при редактировании "уже готового" компонента довольствуюсь ctrl+shift+S,project- "Build all projects", "Compile all projects", run - изменения вступают в силу (правда не всегда, но как правило). Создаешъ самый примитивный компонент, устанавливаешь его в Делфи, бросаешь на форму а потом редактируешь. У меня на Delphi7 так катит. Приду сработыприведупример какого-нибудь компонента. |
#7
|
||||
|
||||
Вот например таков компонент на основе TGraphicControl - умеет загружать битмапы и вращать на определенный угол. Понятное дело, недоделанный
Но по сути, должно быть что-то такое. |
#8
|
||||
|
||||
Давайте лучше начнём с чего попроще, установка прозрачности.
Я тут на сайте нашел: Код:
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
|
||||
|
||||
В общем решил пока так пока написать, не в компонент, просто в приложение, потом в компонент перенесу.
|
#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
|
|||
|
|||
Несколько советов.
1. Если все-равно надо будет делать компонент, то проще сразу компонент и делать. Компонент отличается от простого класса только тем, что имеет процедуру регистрации (которая, кстати, для работы самого компонента не нужна). Ну и еще конструктор имеет стандартную сигнатуру. Обычно, при написании компонента, создается новый проект, в котором в OnCreate твой компонент динамически создается и настраивается (первоначальные настройки, которые в обычном режиме задаются через Object Inspector). 2. Вот конкретно в твоем случае я бы наследовался бы от TPaintBox (или TCustomPaintBox, что, наверное, лучше, т.к. можно будет опубликовать только нужные свойства/методы), в своем компоненте завел бы поле типа TBitmap (для хранения изображения), ну а дальше все по списку (все методы будут работать с этим полем). |
#12
|
||||
|
||||
Ладно. Послушаю совета.
Код:
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. |