|
Вопрос # 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! Буду учиться
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|