| 
| 
 | Вопрос # 3 468/ вопрос открыт / | 
 |  Приветствую, уважаемые эксперты!Задача следующая. Есть image1 с загруженной картинкой.
 Необходимо "порезать картинку на части и каждую часть сохранить в отдельный файл. Желательно "обход" картинки делать в следующем порядке: н.п. картинка из частей 4х4 -
 слева направо 1-ряд 1,2,3,4 потом второй ряд 5,6,7,8 и т. д. Названия файлов соответстенны названиям  копируемых частей.
 Конечно же пробовал сам (Canvas.CopyRect), но никак не могу
 нормально организовать работу в цикле.
 Задача вроде не сложная, но я в недоумении. Помогите пожалуйста.
 
|  |   Вопрос задал: timkit (статус: Посетитель)Вопрос отправлен: 2 декабря 2009, 06:05
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: min@y™ Ну вот написал я тебе примерчик. Прицепляю к ответу.К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)
 
 
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 2 декабря 2009, 10:59
 
 |  
 Мини-форум вопросаВсего сообщений: 5; последнее сообщение — 2 декабря 2009, 14:10; участников в обсуждении: 2. 
|   | min@y™ (статус: Доктор наук), 2 декабря 2009, 08:28 [#1]: Цитата (timkit): но никак не могу нормально организовать работу в цикле.  
 Что конкретно не получается?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | timkit (статус: Посетитель), 2 декабря 2009, 09:13 [#2]:Опишу более конкретно, что сделал я. На форме есть 2 компонента Image, Paintbox, Button.
 Image1-собственно компонент с исходным изображением, Paintbox- своего рода зонд (копирует в себя част изображения и перемещается по Image1), Image2 - показывает что в данный момент скопировал PaintBox и одновременно сохраняет текущее изображение в файл, кнопка для запуска цикла. PaintBox и Image2 имеют одинаковые размеры (у меня 20х20 пкс).
 Приведу свой код:
 
 
 
  
// В данном примере загруженное изображение размером 640х480
 
procedure TForm1.ButtonClick(Sender: TObject);
var
i,j:integer;
begin
//Устанавливаем Paintbox в начало координат Image1
paintbox1.Left:=Image1.Left;
paintbox1.Top:=Image1.Top;
 
 
for j := 0 to (Image1.Height div PaintBox1.Height) do
for i := 0 to (Image1.Width div PaintBox1.Width) do
 
// Если  (i>32) т.е. ((Image1.Width div PaintBox.Width)=
// 640/20 =32) Определяем что PaintBox дошел до края Image1.
begin
if i>32 then 
// Если PaintBox дошел до края Image1, то устанавливаем 
// положение PaintBox в исходное
 
begin
paintbox1.Left:=image1.Left;
end;
 
paintbox1.Left:=(paintbox1.Width*i)-PaintBox1.Width;
 
if i&>32 then
// Также если PaintBox дошел до края Image1 то опускаем 
// PaintBox на следующий ряд
 
begin 
paintbox1.Top:=paintbox1.Top+paintbox1.Height;
end;
 
paintbox1.Top:=(paintbox1.Height*j)-PaintBox1.Height;
 
Image2.Canvas.CopyRect(PaintBox1.Canvas.ClipRect,PaintBox1.Canvas,Image2.ClientRect);
Image2.Picture.SaveToFile('C:\'+inttostr(i*j)+'.jpg');
end;
end;В итоге после прхождения первого ряда все копирование иде черт знает как (хаотично). Для удобства восприятия я сделал картинку разлинованную на квадраты и пронумеровал каждый квадрат. Я бы скинул картинку только не знаю куда?
 |  
|   | min@y™ (статус: Доктор наук), 2 декабря 2009, 09:39 [#3]:Жуть какая. Вопрос поставлен неправильно. Если это "есть картинка MxN пикселей, надо её разбить на XxY фрагментов. Как это сделать?", то я не понимаю, зачем PaintBox1 и Image2.
 
 З.Ы. Отформатируй код нормально, а то вообще не читабельный он.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | timkit (статус: Посетитель), 2 декабря 2009, 09:54 [#4]:В принципе наличие Paintbox и Image2 не принципиально, если есть какой то другой способ, поскажите. Согласен, что корявый способ, но сам больше ничего не придумал.
 |  
|   | timkit (статус: Посетитель), 2 декабря 2009, 14:10 [#5]:Спасибо min@y! Буду учиться   |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |