Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

Поворот и сдвиг картинки   Найти похожие ветки 

 
VasRog ©   (2003-12-11 21:42) [0]

Всем привет.
Как считать из файла картинку и повернуть ее на определенный угол и сдвинуть по осям координат. Т.е. проблема состоит в незнании процедур считывания пикселов, изменения их координат и последующей установки их на новое место.
И еще один вопросец. Если созданы несколько полей и необходимо программе считать  введенные пользователем данные из этих полей, а потом с ними работать, то вероятно нужно переводить их из строкового формата в целый. Если есть такие функции в Дельфи для перевода туда и обратно, то подскажите, плиз.


 
Deb ©   (2003-12-12 02:07) [1]

Canvas.Pixels[x,y]


 
VasRog ©   (2003-12-12 16:07) [2]

Хочется сделать не через канву, а в TImag"е. Неужели никак нельзя?
И еще вопросик. Как сделать, чтобы при передвижении мышкой по картинке в TImag"е координаты местоположения курсора относительно картинки отображались бы рядом с курсором?


 
Agent13   (2003-12-12 16:23) [3]

>Хочется сделать не через канву, а в TImag"е.

Ну так и используй Image.Canvas.Pixels[x,y]

>нужно переводить их из строкового формата в целый.

StrToInt


 
Amoeba ©   (2003-12-15 14:39) [4]

А не рановато ли тебе браться за такие задачи?


 
Ega23 ©   (2003-12-15 15:07) [5]


> И еще вопросик. Как сделать, чтобы при передвижении мышкой
> по картинке в TImag"е координаты местоположения курсора
> относительно картинки отображались бы рядом с курсором?

Событие OnMouseMove, функция GetMousePos, если мне память не изменяет.
Или даже лучше на OnIdle вешать.


 
Alexest   (2003-12-15 15:10) [6]

вывод в заданное место - BitBlt или StretchBlt
const
 FScale = 0.5

var
DC: HDC;
BackImage: TBitmap;
begin
 BackImage := TBitmap.Create;
 BackImage.LoadFromFile(FileName);
 PanelDC := GetDC(Panel1.Handle);
 if BackImage <> nil then
   StretchBlt(PanelDC, 0, 0,
       Round(BackImage.Width*FScale), Round(BackImage.Height*FScale),
       BackImage.Canvas.Handle,       // handle to source DC
       BackImage.Canvas.ClipRect.TopLeft.X,  // x-coord of source upper-left corner
       BackImage.Canvas.ClipRect.TopLeft.Y,  // y-coord of source upper-left corner
       BackImage.Width, BackImage.Height, SRCCOPY);
 ReleaceDC(Panel1.Handle, PanelDC)
end;


поворот - PlgBlt
пример. BackImage - TBitmap;
procedure TPaintPanel.Rotation(const Angle: Double);
var
 P: array [0..2] of TPoint;
begin

по всем вопросам смотри Help или www.msdn.com
 p[0].X := 0; p[0].Y := 100; //координата лев. верх. точки оси
 p[1].X := 520; p[1].Y := 0; //координата прав. верх. точки оси
 p[2].X := 100; p[2].Y := 320;//координата ниж. левой точки оси
 PlgBlt(BackImage.Canvas.Handle, P, BackImage.Canvas.Handle,
        BackImage.Canvas.ClipRect.TopLeft.X,  // x-coord of source upper-left corner
        BackImage.Canvas.ClipRect.TopLeft.Y,  // y-coord of source upper-left corner
        BackImage.Width, BackImage.Height, 0, 0, 0);
end;


 
REA ©   (2003-12-15 15:22) [7]

PlgBlt
Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Unsupported.


 
Amoeba ©   (2003-12-15 15:43) [8]

Что касается поворота картинки, то есть бесплатный компонент:
http://www.delphiarea.com/products/rotateimage/default.htm


 
Dimka Maslov ©   (2003-12-15 16:30) [9]

http://delphibase.endimus.com/?action=viewfunc&topic=mediaimg&id=10186


 
Calm ©   (2003-12-15 16:56) [10]

Что касаетс поворота, то можно почиатть про матрицы преобразований.


 
VasRog ©   (2003-12-19 11:35) [11]

Ну хорошо. С поворотом все более или менее ясно. А вот со сдвигом очень большие проблемы. Дело вот в чем: у меня есть картинка, загруженная в TImage. Теперь ее хочется сдвинуть по осям координат на определенную величину. Есть ли в Дельфи как бы буфер обмена т.е. чтобы я эту картинку считал с канвы и снова ее поместил с измененными координатами на нее же.


 
Ega23 ©   (2003-12-19 11:44) [12]

Создай виртуальный Bitmap, скопируй в него содержимое твоего Image через CopyRect, очисть Image, скопируй с Bitmap на Image с новыми координатами, убей битмап.
Только я бы порекомендовал TPaintBox использовать, когда сам рисуешь.


 
VasRog ©   (2003-12-19 19:56) [13]

Это то, что нужно!!! Но можно это в виде кода - хотя бы примерного, а то я совсем начинающий.


 
Тимохов ©   (2003-12-19 20:00) [14]

Значек "совсем начинающий" также как значек туфли на машине не освобождает от выполнения правил.
Правило первое и самое мощное - читай и напряги мозги.


 
VasRog ©   (2003-12-19 23:51) [15]

OK. Тогда хотя бы процедуры(функции) напишите для всяких там "Создай виртуальный Bitmap","очисть Image","скопируй с Bitmap на Image с новыми координатами","убей битмап" чтобы знать, что в Help"е смотреть.
Особенно интересует "скопируй с Bitmap на Image с новыми координатами".

"не освобождает от выполнения правил" - а что у программистов естб кодекс: "Обломи ближнего своего"?


 
Нурик ©   (2003-12-20 06:54) [16]

Читайте книги по Аналитической геометрии: поворот, смещение координат


 
MAXIMUS   (2004-01-05 23:31) [17]

Слушай "VasRog", ты ещё не сделал своё маленькое открытие по теме перемещения BitMap? Могу помочь , если хочешь разумеется.
(((( Но книжки почитай всё-таки !!!!!!!!!!)))))))))))


 
Ilya   (2004-01-06 18:12) [18]

procedure MyFirstDrawing;
var
 Bitmap: TBitmap;
 X, Y: Integer;
begin
 {Создание}
 Bitmap := TBitmap.Create;
 {Делаешь с ним, что тебе нужно}

 {Например загружаешь рисунок}
 Bitmap.LoadFromFile("Tank.bmp");

 {Устанавливаешь координаты рисования}
 X := 100;
 Y := 100;

 {рисуешь на Image}
 Image.Canvas.Draw(X, Y, Bitmap);

 {Заливаешь, т.е. стираешь прежний рисунок}
 Image.Canvas.FillRect(Image.ClientRect);

 {Меняешь координаты}
 X := X + 1;
 Y := Y + 1;
 
 {снова рисуешь на Image, только в другом месте}
 Image.Canvas.Draw(X, Y, Bitmap);
 

 {Другие процедуры смотри Help, ставь курсор на название
  процедуры и жми клавишу F1}
 
 Bitmap.Canvas.Pixels[X, Y];
 Bitmap.ScanLine(Row);
 Bitmap.Canvas.CopyRect(Rect1, Image.Canvas, Rect2);
 Bitmap.Canvas.Draw(X, Y, MyBitmap);
 

 {Обязательно удаляешь}
 {Удаляешь только тогда, когда он уже не нужен, а не после
  каждого рисования}
 Bitmap.Free;
end;
Обязательно купи хорошую книгу по Делфи иначе твои
программы будут неправильными.
На Хелпе далеко не уедешь.


 
VasRog ©   (2004-02-12 10:50) [19]

Господа, помогите, пожалуйста, найти ошибку. Вот две функции из проги:
Эта функция осуществляет поворот картинки:

function RotateBitmap(Bitmap: TBitmap; Angle: Double; Color: TColor; Incx:word; Incy:word): TBitmap;
const
MaxPixelCount = 32768;
type
PRGBTripleArray = ^TRGBTripleArray;
TRGBTripleArray = array[0..MaxPixelCount] of TRGBTriple;
var
A: Extended;
CosTheta: Extended;
SinTheta: Extended;
xSrc, ySrc: Integer;
xDst, yDst: Integer;
xODst, yODst: Integer;
xOSrc, yOSrc: Integer;
xPrime, yPrime: Integer;
srcRow, dstRow: PRGBTripleArray;
begin
Result := TBitmap.Create;
// Workaround SinCos bug
A := Angle;
while A >= 360 do A := A - 360;
while A < 0 do A := A + 360;
// end of workaround SinCos bug
SinCos(A * Pi / 180, SinTheta, CosTheta);
if (SinTheta * CosTheta) < 0 then
begin
  Result.Width := Round(Abs(Bitmap.Width * CosTheta - Bitmap.Height * SinTheta));
  Result.Height := Round(Abs(Bitmap.Width * SinTheta - Bitmap.Height * CosTheta));
end
else
begin
  Result.Width := Round(Abs(Bitmap.Width * CosTheta + Bitmap.Height * SinTheta));
  Result.Height := Round(Abs(Bitmap.Width * SinTheta + Bitmap.Height * CosTheta));
end;
with Result.Canvas do
begin
  Brush.Color := Color;
  Brush.Style := bsSolid;
  FillRect(ClipRect);
end;
Result.PixelFormat := pf24bit;
Bitmap.PixelFormat := pf24bit;
xODst := Result.Width div 2;
yODst := Result.Height div 2;
xOSrc := Bitmap.Width div 2;
yOSrc := Bitmap.Height div 2;
if CosTheta < 0 then Dec(xOSrc);
if SinTheta < 0 then Dec(yOSrc);
for ySrc := Max(Bitmap.Height, Result.Height)-1 downto 0 do
begin
  yPrime := ySrc - yODst;
  for xSrc := Max(Bitmap.Width, Result.Width)-1 downto 0 do
  begin
    xPrime := xSrc - xODst;
    xDst := Round(xPrime * CosTheta - yPrime * SinTheta) + xOSrc;
    yDst := Round(xPrime * SinTheta + yPrime * CosTheta) + yOSrc;
    if (yDst >= 0) and (yDst < Bitmap.Height) and
       (xDst >= 0) and (xDst < Bitmap.Width) and
       (ySrc >= 0) and (ySrc < Result.Height) and
       (xSrc >= 0) and (xSrc < Result.Width) then
    begin
      srcRow := Bitmap.ScanLine[yDst];
      dstRow := Result.Scanline[ySrc];
      dstRow[xSrc] := srcRow[xDst];
    end;
  end;
end;
end;

Эта процедура(точнее ее часть после except) сдвигает картинку по осям координат в зависимости от значений ползунков(TrackBar5 - ось ox и TrackBar6 - ось oy):

procedure TForm1.Button1Click(Sender: TObject);
var
p:TBitmap;
X,Y:word;
begin
p:=TBitmap.Create;
CopyMe(p,Image1.Picture.Graphic);
Contrast(p,TrackBar1.Position);
Darkness(p,TrackBar4.Position);
Lightness(p,TrackBar2.Position);
p:=RotateBitmap(p,TrackBar3.Position,Color,TrackBar5.Position,TrackBar6.Position);
try
Image2.Picture.Bitmap.FreeImage;
except; end;
X:=TrackBar5.Position;
Y:=TrackBar6.Position;
Image2.Picture.Bitmap.Assign(p);
Image2.Canvas.Brush.Color:=Color;
Form1.Image2.Canvas.Draw(X,Y,p);
Form1.Image2.Canvas.FillRect(Image2.ClientRect);
Form1.Image2.Canvas.Draw(X,Y,p);
p.Free;
end;

В результате получается,что чем больше двигаем ползунок(перемещаем картинку по любой оси), тем большая часть картинки "сьедается"(как будто уходит за край экрана).Заместо перемещения. :(



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.063 c
3-1079074744
lats
2004-03-12 09:59
2004.04.11
Обновление данных в SQL запросе на IB


8-1075903834
Urvin
2004-02-04 17:10
2004.04.11
КОЛИЧЕСТВО Цветов


3-1079452121
Alexei Sviridov
2004-03-16 18:48
2004.04.11
IBBackupService


8-1076742253
Dio
2004-02-14 10:04
2004.04.11
Звуковая карта


4-1075899409
graY
2004-02-04 15:56
2004.04.11
Как програмно щелкнуть на кнопке типа TToolButoon ведь у ...