Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение части картинки. CopyRect? 
V
    Опции темы
iddqd
Дата 5.7.2006, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 16.11.2005

Репутация: нет
Всего: 2



Есть переменная TBitmap, в которую загружена картинка.
Необходимо написать функцию, в которую передаётся верхняя левая точка, ширина и высота нужной области и эта область вырезается.
Функция возвращает только вырезанный TBitmap.
Пытаюсь сделать через CopyRect не особо получается. Вырезает нужную мне область из первоначальной картинки и оставляет белый прямоугольник, а где то, что было в этом прямоугольнике?:\
Не могу получить. 


--------------------
PM MAIL   Вверх
Alexeis
Дата 5.7.2006, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



iddqd, вы вероятно перепутали source и dest, или вызвали метод copyrect, не у того канваса.

Добавлено @ 14:41 
Поэкспериментируйте с canvas.CopyMode 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
iddqd
Дата 5.7.2006, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 16.11.2005

Репутация: нет
Всего: 2



Код

Bmp:=TBitmap.Create;
Bmp.LoadFromFile('x.bmp');
R.Left:=0;
R.Top:=0;
R.Right:=100;
R.Bottom:=300;
Bmp.Canvas.CopyRect(R, bmp.Canvas, Rect(0, 0, 100, 300));
//Bmp.Canvas.FillRect(R); <- дальше как? :\
Image1.Picture.Bitmap.Assign(Bmp);
Bmp.Free;
 


--------------------
PM MAIL   Вверх
Alexeis
Дата 5.7.2006, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



CopyRect  нужно вызывать у канваса приемника, а не источника. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
iddqd
Дата 5.7.2006, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 16.11.2005

Репутация: нет
Всего: 2



С CopyMode эксперименты тоже проводились smile 


--------------------
PM MAIL   Вверх
Alexeis
Дата 5.7.2006, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(iddqd @  5.7.2006,  14:43 Найти цитируемый пост)
Bmp.Canvas.CopyRect(R, bmp.Canvas, Rect(0, 0, 100, 300));

нельзя копировать в свой же канвас - только из чужого в свой. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
iddqd
Дата 5.7.2006, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 16.11.2005

Репутация: нет
Всего: 2



Да, я понял ошибку, н овсё же такой код не работает:

Код

var
R: TRect;
Bmp: TBitMap;
begin
Bmp:=TBitmap.Create;
Image1.Picture.Bitmap.LoadFromFile('x.bmp'); //картинка точно загружается
R.Left:=0;
R.Top:=0;
R.Right:=100;
R.Bottom:=300;
Bmp.Width:=100; //надо ли эти два пункта?
Bmp.Height:=300;
Bmp.Canvas.CopyRect(R, Image1.Picture.Bitmap.Canvas, Rect(0, 0, 100, 300));
Bmp.Canvas.FillRect(R); //правильная функция?
Image1.Picture.Bitmap.Assign(Bmp);
Bmp.Free;
end;


В итоге белый прямоугольник нужных размеров smile

Добавлено @ 15:23 
Разобрался. FillRect было лишним smile
Спасибо.
+1 


--------------------
PM MAIL   Вверх
Alexeis
Дата 5.7.2006, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(iddqd @  5.7.2006,  15:10 Найти цитируемый пост)
Bmp.Canvas.FillRect®; //правильная функция?

Вы вначале копируете в указанную область, а затем fillrect, затирает то что было скопировано. Подробнее опишите задачу.(алгоритм не совсем ясен)

Цитата(iddqd @  5.7.2006,  15:10 Найти цитируемый пост)
Bmp.Width:=100; //надо ли эти два пункта?Bmp.Height:=300;

Надо иначе не куда будет копировать.
 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
teplotaya
Дата 24.7.2006, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 10.3.2006

Репутация: нет
Всего: 2



Код

procedure TForm1.split(x1,y1,x2,y2:integer;filesave:string;fileread:string);
VAR
  Bitmap: TBitmap;
  MyRect,MyRect2, MyOther: TRect;
  dest,Source:TRECT;
  Bitmap1,bitmap2,Bitmap3:tbitmap;
  jpeg:TJpegimage;
begin
  jpeg:=TJpegImage.Create;
  //jpeg.Assign(Image1.Picture.Bitmap);
  //jpeg.CompressionQuality:=1;
  jpeg.Grayscale:=false;
  //jpeg.DIBNeeded; // jpeg.JPEGNeeded – òàêæå íå ïîìàãàåò
  //jpeg.Compress;
  //jpeg.SaveToFile('c:\test.jpg');        //**
  jpeg.LoadFromFile(fileread);

  MyRect := Rect(x1,y1,x2,y2);
  MyRect2 := Rect(0+5,0+5,x2-x1+5,y2-y1+5);
  Bitmap := TBitmap.Create;
  Bitmap1 := TBitmap.Create;
  //Bitmap.LoadFromFile(fileread);
  bitmap.Assign(jpeg);
  //jpeg.Assign(bitmap.Canvas);
  //Application.ProcessMessages;
  Form1.Canvas.BrushCopy(MyRect2, Bitmap, MyRect, clnone);
  //Application.ProcessMessages;
  bitmap1.Canvas.Brush.Color := clblack;
  Bitmap1.Width:=x2-x1+10;
  Bitmap1.Height:=y2-y1+10;
  Bitmap1.Canvas.CopyRect(MyRect2,Bitmap.Canvas,MyRect);
  try
    Bitmap1.SaveToFile(filesave);
    inc(coo);
  except
    dec(coo);
  end;
  Bitmap.Free;
  Bitmap1.Free;
  //Bitmap2.Free;
  jpeg.Free; 


M
Snowy
Просьба использовать кнопку "Код".
Мне совсем не интересно за всеми производить оформление.
 

Это сообщение отредактировал(а) Snowy - 24.7.2006, 15:29
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0632 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.