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

Вниз

Как обрезать 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.003 c
3-1253089294
d@vinchi
2009-09-16 12:21
2011.02.20
DAO: как создать Memo поле с возможностью ввода пустых строк?


15-1289568102
Медвежонок Пятачок
2010-11-12 16:21
2011.02.20
ипонский городо... голограммОй


15-1289299836
luzer
2010-11-09 13:50
2011.02.20
Настройка печати по сети hp officejet 7000


15-1289337316
Kerk
2010-11-10 00:15
2011.02.20
Катастрофа


2-1290762980
axels
2010-11-26 12:16
2011.02.20
gecko browser





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский