Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.08.10;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.007 c
15-1214065908
TMichael
2008-06-21 20:31
2008.08.10
Linux c++


15-1213883179
Dmitry S
2008-06-19 17:46
2008.08.10
сила/ускорение/скорость


4-1194246203
Sunshine
2007-11-05 10:03
2008.08.10
Программная имитация COM порта.


15-1214224288
grisme
2008-06-23 16:31
2008.08.10
GPRS + телефон?


2-1214996937
JanMihail
2008-07-02 15:08
2008.08.10
Количество элементов в множестве





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский