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

Вниз

Как обрезать Image в Delphi 7?   Найти похожие ветки 

 
Анонимус   (2010-11-25 18:49) [0]

Дана картинка Image1 с разрешением, например 200х200. Каким образом её можно обрезать до разрешения 100х100?
Пробовал, например, задавать
Image1.Picture.Width:=100;
так он пишет об ошибке.
Искал во всяких другиз Image1.Picture - но тоже ничего похожего не нашёл.


 
clickmaker ©   (2010-11-25 18:50) [1]

обрезать с масштабированием? TImage.Stretch тогда


 
Анонимус   (2010-11-25 18:53) [2]


> обрезать с масштабированием? TImage.Stretch тогда

Нет, без него.
Нужно как раз отрезать лишнее.


 
clickmaker ©   (2010-11-25 19:52) [3]

значит, без Stretch. Image.Width :=


 
Анонимус   (2010-11-25 21:56) [4]


> Image.Width :=

Не знаю почему, но почему-то не получается. Может там надо в свойствах объекта поменять?


 
Анонимус   (2010-11-25 21:57) [5]


>  Может там надо в свойствах объекта поменять?

*что-то поменять


 
ghostdelvonte@mail.ru   (2010-11-25 22:01) [6]

ARect: TRect;

.....

ARect:= Rect(0, 0, 100, 100);
with Bitmap.Canvas do
      CopyRect(Bitmap.Canvas.ClipRect, Bitmap.Canvas, ARect);


 
ghostdelvonte@mail.ru   (2010-11-25 22:03) [7]

Что-то типа этого, я так делал


 
Анонимус   (2010-11-25 22:08) [8]


> with Bitmap.Canvas do

Вот на этой строчке ставит курсор после Canvas и выдаёт ошибку
[Error] Unit1.pas(1139): Object or class type required

На следующей строчке то же самое. Насколько я понял, тут нужно как-то ему указать Image1?


 
ghostdelvonte@mail.ru   (2010-11-25 22:12) [9]

ARect: TRect;
Bitmap: TBitmap;

.....

ARect:= Rect(0, 0, 100, 100);
Bitmap:= TBitmap.Create;
Bitmap.Width:= 100;
Bitmap.Height:= 100;
with Bitmap.Canvas do
     CopyRect(Bitmap.Canvas.ClipRect, Image1.Canvas, ARect);

************************************************


 
ghostdelvonte@mail.ru   (2010-11-25 22:14) [10]

А потом битмат копируй в имейдж и удаляй битмап


 
Анонимус   (2010-11-25 22:21) [11]

ghostdelvonte@mail.ru
Ничего не происходит.
На всякий случай уточните, как надо копировать? Может я не так копирую.


 
ghostdelvonte@mail.ru   (2010-11-25 22:27) [12]

Если у тебя в имейдже загружен рисунок не битмап формата то, сначала надо либо преобразовать его в битмап или связать с имейджем канву

ARect: TRect;
Bitmap: TBitmap;
DCanvas: TControlCanvas;

.....

ARect:= Rect(0, 0, 100, 100);
Bitmap:= TBitmap.Create;
Bitmap.Width:= 100;
Bitmap.Height:= 100;
DCanvas:= TControlCanvas.Create;
DCanvas.Control:= Image1;

with Bitmap.Canvas do
     CopyRect(Bitmap.Canvas.ClipRect, DCanvas, ARect);
Image1.Picture.Assign(Bitmap);
DCanvas.Free;
Bitmap.Free;

**********************************************
Я таким образом копировал нужные мне участки на изображении!


 
Анонимус   (2010-11-25 22:45) [13]

ghostdelvonte@mail.ru
Да, всё работает. Большое спасибо за помощь!

И ещё вопрос так, из любопытства: зачем в конце битмап удалять?


 
ghostdelvonte@mail.ru   (2010-11-25 22:49) [14]

При создании битмапа - резервируется под него память, если не удалить битмап - память не вернется в кучу!


 
Анонимус   (2010-11-25 22:54) [15]


> память не вернется в кучу!

А какими последствиями это грозит?=)


 
clickmaker ©   (2010-11-25 23:03) [16]

> А какими последствиями это грозит?=)

куча обидится и больше не даст


 
ghostdelvonte@mail.ru   (2010-11-25 23:03) [17]

Попробуй это и узнаешь:

var
Bitmap: array[1..1000000] of TBitmap;
X: Integer;
begin
for X:= 1 to 1000000 do
begin
  Bitmap[X]:= TBitmap.Create;
  Bitmap[X].Width := 1024;
  Bitmap[X].Height:= 768;
end;


 
Анонимус   (2010-11-25 23:10) [18]


> куча обидится и больше не даст

Да, пожалуй это и правда будет не слишком-то хорошо, если она так сделает.


> Попробуй это и узнаешь:

Что-то меня не тянет пробовать такие опасно выглядящие вещи=)
Ладно, ещё раз спасибо за помощь, пойду дальше прогу ковырять.


 
Inovet ©   (2010-11-25 23:13) [19]

> [15] Анонимус   (25.11.10 22:54)
> А какими последствиями это грозит?=)

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

Это не то что вопросов вызывать не должно, а должно  писаться на автомате - выделил память/создал объект, как только закончил с ней/с ним работать, освободи. И обязательно это надо брать в блок try finally

Bitmap:= TBitmap.Create;
try
 // что-то делаем
finally
 Bitmap.Free;
end;


 
Ghost del vonte ©   (2010-11-25 23:19) [20]

>>Inovet ©   (25.11.10 23:13) [19]

Вот-вот!


 
Анонимус   (2010-11-26 00:05) [21]


> И обязательно это надо брать в блок try finally

Даже так?
Inovet, спасибо за инфу, буду знать.



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

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

Наверх




Память: 0.51 MB
Время: 0.011 c
2-1291200879
Демерго
2010-12-01 13:54
2011.02.20
Вытащить часть текста из Memo


2-1291216049
Демерго
2010-12-01 18:07
2011.02.20
текст HTML Документа из TWebBrowser без тегов


15-1288631685
Tema
2010-11-01 20:14
2011.02.20
Как зарегистрироваться на Embarcadero?


15-1289291628
Kerk
2010-11-09 11:33
2011.02.20
Посоветуйте софт для каталогизации фото


15-1287782094
Petr V. Abramov
2010-10-23 01:14
2011.02.20
Фильм "Ярослав"