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

Вниз

Можно ли обрезать изображение???   Найти похожие ветки 

 
Zhentos   (2008-07-08 09:23) [0]

Предположим есть изображение, загруженное в компонент класса TImage, можно ли обрезать это изображение, по n пикселей с каждой из сторон, оставив центральную часть???


 
Плохиш ©   (2008-07-08 10:12) [1]


> Zhentos   (08.07.08 09:23)  

Если владелец изображения не против, то можно.
Создаёшь новое изображение с желаемыми размерами и отрисовываешь на нём старое, сместив на нужное количество пикселей в право и вверх.


 
Zhentos   (2008-07-08 10:20) [2]

ну допустим сдвинул влево и вверх, но ведь это не обрежет правый и нижний участки.


 
Плохиш ©   (2008-07-08 10:25) [3]


> Zhentos   (08.07.08 10:20) [2]
> ну допустим сдвинул влево и вверх, но ведь это не обрежет
> правый и нижний участки.

А те букавы, что стоят до "и", я для пушкина набивал?


 
Zhentos   (2008-07-08 10:25) [4]

упс...

всё правильно...


 
Zhentos   (2008-07-08 10:26) [5]

спасибо


 
Тын-Дын ©   (2008-07-08 11:50) [6]

Есть такой метод - CopyRect.


 
Zhentos   (2008-07-08 12:15) [7]

2 Тын-Дын ©   (08.07.08 11:50) [6]
а как потом вставить скопированный прямоугольник?


 
{RASkov} ©   (2008-07-08 12:25) [8]

> [7] Zhentos   (08.07.08 12:15)

Метод CopyRect переносит участок изображения с одного холста на другой


 
Anatoly Podgoretsky ©   (2008-07-08 12:33) [9]

> Zhentos  (08.07.2008 12:15:07)  [7]

Вставляй в позицию 0,0


 
Zhentos   (2008-07-08 12:33) [10]

{RASkov} ©   (08.07.08 12:25) [8]
как быть, если нужно в пределах одного холста вырезать квадрат, из середины, и уменьшить холст до размеров квадрата?


 
{RASkov} ©   (2008-07-08 12:49) [11]

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

Так не выйдет, нужен "временный"(или конечный вариант) холст для хранения "куска" картинки...


 
Zhentos   (2008-07-08 13:00) [12]

мда, просто у меня изображение практически на весь экран, и вырезаемый квадрат практически на весь экран (((

делаю так:
var
MyRect, MyOther: TRect;
begin
MyRect := Rect(Shape1.Left, Shape1.Top, Shape1.Left + Shape1.Width,  Shape1.Top + Shape1.Height);
MyOther := Rect(0, 0, Shape1.Width, Shape1.Height);
Image1.Canvas.CopyRect(MyOther, Image1.Canvas, MyRect);
Shape1.Left := 0;
Shape1.Top := 0;
end;

но осталась проблема... из под вставленного квадрата "торчитат" остатки целого изображения.


 
Zhentos   (2008-07-08 13:15) [13]

сорри, есть контакт...

просто stretch и Proportional было true.


 
Zhentos   (2008-07-08 13:22) [14]

нет, нет контакта(((

var
MyRect, MyOther: TRect;
begin
MyRect := Rect(Shape1.Left, Shape1.Top, Shape1.Left + Shape1.Width, Shape1.Top + Shape1.Height);
MyOther := Rect(0, 0, Shape1.Width, Shape1.Height);
Image1.Canvas.CopyRect(MyOther, Image1.Picture.Bitmap.Canvas, MyRect);
Shape1.Left := 0;
Shape1.Top := 0;
Image1.Proportional := false;
Image1.Stretch := false;
Image1.Width := Shape1.Width;
Image1.Height := Shape1.Height;
Image1.Picture.SaveToFile(ExtractFilePath(paramstr(0)) + "Picture.bmp");
end;


на экране только та область которая мне нужна, а сохраняет с фоном, краями изображения, из которого вырезался квадрат((( Как быть?


 
{RASkov} ©   (2008-07-08 14:00) [15]

var Bmp, TmpBmp: TBitmap; R: Trect;
begin
 BMp:=TBitmap.Create;
 tmpbmp:=tbitmap.create;
 bmp.loadfromfile();
 R:=Rect(0, 0, bmp.width, bmp.height);
 inflaterect(R, -20, -20);
 tmpbmp.width:=R.Right-R.Left;
 tmpbmp.height:=R.bottom-R.top;
 tmpbmp.canvas.copyrect(R, Bmp.canvas, R);
 tmpbmp.savetofile();
 bmp.free;
 tmpbmp.free;
end;


 
Leonid Troyanovsky ©   (2008-07-08 15:12) [16]


> {RASkov} ©   (08.07.08 14:00) [15]

>  tmpbmp.canvas.copyrect(R, Bmp.canvas, R);

with tmpbmp.canvas do copyrect(ClipRect, Bmp.canvas, R);

--
Regards, LVT.


 
Zhentos   (2008-07-08 16:03) [17]

начинаю путаться...

var
MyRect, MyOther: TRect;
begin
MyRect := Rect(Shape1.Left, Shape1.Top, Shape1.Left + Shape1.Width, Shape1.Top + Shape1.Height);
MyOther := Rect(0, 0, Shape1.Width, Shape1.Height);
Image1.Canvas.CopyRect(MyOther, Image1.Picture.Bitmap.Canvas, MyRect);
Image1.Proportional := false;
Image1.Stretch := false;
Image1.Width := Shape1.Width;
Image1.Height := Shape1.Height;
end;


этот код копирует квадрат из изображения загруженного в TImage и ставит его в нулевую позицию и по иксу и по игрику. Как "откусить" лишние части именно на этом холсте TImage??? Как мне продолжить работу с изображением загруженным в TImage???


 
Zhentos   (2008-07-08 16:10) [18]

{RASkov} ©   (08.07.08 14:00) [15]
я так понял, что tmpbmp - это как раз временное изображние, в которое будет помещён копируемый участок... потом нужно будет сохранить это в файл, чтобы загрузить в TImage?


 
Leonid Troyanovsky ©   (2008-07-08 16:11) [19]


> Zhentos   (08.07.08 16:03) [17]

> начинаю путаться...

Возьми за основу [15].
Вместо bmp (.loadfromfile) у тебя есть Image1.Picture.Bitmap.
После всех пассов сделай Image1.Picture.Bitmap :=  tmpbmp

Только Free не надо ;)

--
Regards, LVT.


 
Zhentos   (2008-07-08 16:30) [20]

не мужики... мой качан варить отказался (((

я понял только смысл, но реализация отказала...
Нужно скопировать нужную мне область и поместить её во временный TBitmap, после чего присвоить моему компоненту TImage.Picture.Bitmap значение из временного.

как мне присвоить временному TBitmap_у Image1.Canvas.CopyRect(MyOther, Image1.Picture.Bitmap.Canvas, MyRect); вот этот участок... в примере я не увидел этого(((


 
Zhentos   (2008-07-08 16:41) [21]

var TmpBmp: TBitmap; R: Trect;
begin
tmpbmp:=tbitmap.create;
R := Rect(0, 0, Image1.width, Image1.height);
inflaterect(R, Shape1.Width - Image1.Width, Shape1.Height - Image1.Height);
tmpbmp.width := Shape1.Width;
tmpbmp.height := Shape1.Height;
// tmpbmp.canvas.copyrect(R, Bmp.canvas, R);
with tmpbmp.canvas do copyrect(ClipRect, Image1.canvas, R);
Image1.Picture.Bitmap :=  tmpbmp;

end;

что я делаю не так?


 
{RASkov} ©   (2008-07-08 17:10) [22]

> [21] Zhentos   (08.07.08 16:41)

var R, R1: TRect;
begin
 R:=Rect(140, 100, 255, 155); //Этот участок "вырезаем"
 R1:=Rect(0, 0, R.Right-R.Left, R.Bottom-R.Top);
 Image1.Canvas.CopyRect(R1, Image1.Canvas, R);
 Image1.Picture.Bitmap.Width:=R.Right-R.Left;
 Image1.Picture.Bitmap.Height:=R.Bottom-R.Top;
end;



> что я делаю не так?

А ты с размерами области R ничего не перемудрил? И почитай что делает InflateRect - наверняка это не для тебя, а я просто для примера вставлял его....


 
Zhentos   (2008-07-08 17:10) [23]

странно, думал задача не сложная(((


 
{RASkov} ©   (2008-07-08 17:10) [24]

> [23] Zhentos   (08.07.08 17:10)

А в чем сложность-то? :)


 
Zhentos   (2008-07-08 17:20) [25]

в том, что последний код, который вы прислали, вырезал участок и скопировал его в нулевые координаты, но ширина и высота Image1.Picture.Bitmap.Width(Height), не изменилась(((

а мне нужно чтобы вырезанный участок представлял цельную картинку, загруженную в Image1.Picture.Bitmap.


 
{RASkov} ©   (2008-07-08 17:24) [26]

> [25] Zhentos   (08.07.08 17:20)

У Image1 AutoSize чему равен у тебя?
Код в [22] выполняется с AutoSize=True, иначе делай так:
Image1.Picture.Bitmap.Width:=R.Right-R.Left;
Image1.Picture.Bitmap.Height:=R.Bottom-R.Top;
Image1.Width:=R.Right-R.Left;
Image1.Height:=R.Bottom-R.Top;

Ну что ты как маленький? :)


 
{RASkov} ©   (2008-07-08 17:27) [27]

> но ширина и высота Image1.Picture.Bitmap.Width(Height),
> не изменилась(((

Обманываешь.... не меняется размер компонента Image, а размер битмапа в коде вручную выставляется.... если ты не обратил внимания....


 
Zhentos   (2008-07-08 17:30) [28]

var
MyRect, MyOther: TRect;
begin
MyRect := Rect(Shape1.Left, Shape1.Top, Shape1.Left + Shape1.Width, Shape1.Top + Shape1.Height); // определяем область копирования
MyOther := Rect(0, 0, Shape1.Width, Shape1.Height); //устанавливаем область, в которую будем копировать скопированный фрагмент
Image1.Canvas.CopyRect(MyOther, Image1.Canvas, MyRect); //копируем
Shape1.Left := 0; // область дальнейшей обработки
Shape1.Top := 0; //
Image1.Width := Shape1.Width;
Image1.Height := Shape1.Height;
end;


этот код делает всё, как будто бы верно, но при сохранении Image1.Picture.SaveToF.... сохраняется файл с наложенной на исходную картинку, областью копирования(((


 
Zhentos   (2008-07-08 17:34) [29]


> Обманываешь.... не меняется размер компонента Image, а размер
> битмапа в коде вручную выставляется.... если ты не обратил
> внимания....


да, и впрямь обманываю...

Спасибо за терпение и помощь!!!


 
{RASkov} ©   (2008-07-08 17:45) [30]

> [28] Zhentos   (08.07.08 17:30)
> этот код делает всё, как будто бы верно, но при сохранении
> Image1.Picture.SaveToF.... сохраняется файл с наложенной
> на исходную картинку, областью копирования(((

См [26]


 
{RASkov} ©   (2008-07-08 17:49) [31]

> [28] Zhentos   (08.07.08 17:30)

> См [26]

т.е. теперь ты "обрезал" размер компонента, а размер картинки оставил... Размеры выставляй как компоненту(для визуализации на форме) так и для картинки(чтоб убрать лишнее)...


 
brother ©   (2008-07-09 07:02) [32]

Можно ли обрезать изображение???
странно, думал задача не сложная(((
задумался... как то не стыкуется...


 
Тын-Дын ©   (2008-07-09 11:40) [33]


> задумался... как то не стыкуется...


Что не стыкуется?


 
brother ©   (2008-07-09 13:20) [34]

> Можно ли обрезать изображение???

вопрос с вариантами ответа да или нет...

> думал задача не сложная(((

утверждение с заведомым да...
Либо спросил бы как сделать, либо сабж )))


 
Тын-Дын ©   (2008-07-09 13:52) [35]

Удалено модератором


 
{RASkov} ©   (2008-07-09 13:57) [36]

Удалено модератором



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

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

Наверх




Память: 0.55 MB
Время: 0.015 c
2-1215178202
Pasha L
2008-07-04 17:30
2008.08.10
нужно или не нужно вставлять inherited create?


15-1214414776
tesseract
2008-06-25 21:26
2008.08.10
Аврал на серой ветке.


15-1214187119
Slider007
2008-06-23 06:11
2008.08.10
С днем рождения ! 23 июня 2008 понедельник


2-1215156404
laao
2008-07-04 11:26
2008.08.10
объясните поведение Delphi при выполнении следующего кода


15-1214548406
@!!ex
2008-06-27 10:33
2008.08.10
Быстрое инвертирование матрицы 4х4