|
Вопрос # 2 552/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Как картинку в image разбить на n-одинаковых частей и сохранить эти части с именем соотвествующему номеру каждой части картинке.
 |
Вопрос задал: GAZ (статус: Посетитель)
Вопрос отправлен: 23 марта 2009, 07:20
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: min@y™
Вот, написал тебе тестовую программу. В ней есть функция, которая разрезает картинку ABitmap по горизонтали на N частей и сохраняет их в папке ADir.
procedure SplitBitmap(ABitmap: TBitmap; const N: Integer; const ADir: string);
var
Temp: TBitmap;
Index: Integer;
FileName: string;
begin
Temp:= TBitmap.Create();
Temp.Width:= ABitmap.Width;
Temp.Height:= ABitmap.Height div N;
try
for Index:= 0 to N - 1 do
begin
BitBlt(Temp.Canvas.Handle, 0, 0, Temp.Width, Temp.Height,
ABitmap.Canvas.Handle, 0, Index * Temp.Height, SRCCOPY);
FileName:= IncludeTrailingPathDelimiter(ADir) + 'Part' + IntToStr(Index + 1) + '.bmp';
Temp.SaveToFile(FileName);
end;
finally
Temp.Free();
end;
end;
Прогу прицепляю к ответу. К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)
Приложение: Переключить в обычный режим-
-
- program p2552;
-
- {$APPTYPE CONSOLE}
-
- uses
- Windows, SysUtils, Graphics;
-
- procedure SplitBitmap(ABitmap: TBitmap; const N: Integer; const ADir: string);
- var
- Temp: TBitmap;
- Index: Integer;
- FileName: string;
- begin
- Temp:= TBitmap.Create();
- Temp.Width:= ABitmap.Width;
- Temp.Height:= ABitmap.Height div N;
- try
- for Index:= 0 to N - 1 do
- begin
- BitBlt(Temp.Canvas.Handle, 0, 0, Temp.Width, Temp.Height,
- ABitmap.Canvas.Handle, 0, Index * Temp.Height, SRCCOPY);
- FileName:= IncludeTrailingPathDelimiter(ADir) + 'Part' + IntToStr(Index + 1) + '.bmp';
- Temp.SaveToFile(FileName);
- end;
- finally
- Temp.Free();
- end;
- end;
-
- var
- Source: TBitmap;
- Dir: string;
-
- const
- N = 4;
-
- begin
- Source:= TBitmap.Create();
- Dir:= ExtractFilePath(ParamStr(0));
- try
- Source.LoadFromFile(Dir + 'Image.bmp');
- SplitBitmap(Source, N, Dir);
- finally
- Source.Free();
- end;
-
- WriteLn(' Bitmap is splitted to ', N, 'parts. Press "Enter" to exit...');
- ReadLn;
- end.
-
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 23 марта 2009, 09:43
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 6; последнее сообщение — 25 марта 2009, 21:06; участников в обсуждении: 2.
|
GAZ (статус: Посетитель), 23 марта 2009, 19:11 [#1]:
min@y™
...Temp.Height:= ABitmap.Height div N;
...
for Index:= 0 to N - 1 do...
, а как быть если и Temp.Width:= ABitmap.Width div M;
и ещё можно бес консоли с image, а так спасибо за ответ
|
|
GAZ (статус: Посетитель), 23 марта 2009, 19:18 [#2]:
min@y™
Temp.Width:= ABitmap.Width;
Temp.Height:= ABitmap.Height div N;
, а как быть если и Temp.Width:= ABitmap.Width div M; я имею ввиду как for в этом случае организовать
и ещё можно всё таки с image, я в него изображение загружаю.
|
|
min@y™ (статус: Доктор наук), 25 марта 2009, 18:54 [#3]:
Ну ёмаё, а самому разобраться религия не позволяет?
Ладно, у меня щас хорошее настроение (пива попил). Поэтому написал вторую функцию. Вот программа:
program p2552;
{$APPTYPE CONSOLE}
uses
Windows, SysUtils, Graphics;
// Разбиение картинки по вертикали на N частей
procedure SplitBitmapVert(ABitmap: TBitmap; const N: Integer; const ADir: string);
var
Temp: TBitmap;
Index: Integer;
FileName: string;
begin
Temp:= TBitmap.Create();
Temp.Width:= ABitmap.Width;
Temp.Height:= ABitmap.Height div N;
try
for Index:= 0 to N - 1 do
begin
BitBlt(Temp.Canvas.Handle, 0, 0, Temp.Width, Temp.Height,
ABitmap.Canvas.Handle, 0, Index * Temp.Height, SRCCOPY);
FileName:= IncludeTrailingPathDelimiter(ADir) + 'PartVert' + IntToStr(Index + 1) + '.bmp';
Temp.SaveToFile(FileName);
end;
finally
Temp.Free();
end;
end;
// Разбиение картинки по горизонтали на N частей
procedure SplitBitmapHorz(ABitmap: TBitmap; const N: Integer; const ADir: string);
var
Temp: TBitmap;
Index: Integer;
FileName: string;
begin
Temp:= TBitmap.Create();
Temp.Height:= ABitmap.Height;
Temp.Width:= ABitmap.Width div N;
try
for Index:= 0 to N - 1 do
begin
BitBlt(Temp.Canvas.Handle, 0, 0, Temp.Width, Temp.Height,
ABitmap.Canvas.Handle, Index * Temp.Width, 0, SRCCOPY);
FileName:= IncludeTrailingPathDelimiter(ADir) + 'PartHorz' + IntToStr(Index + 1) + '.bmp';
Temp.SaveToFile(FileName);
end;
finally
Temp.Free();
end;
end;
var
Source: TBitmap;
Dir: string;
const
N = 4;
begin
Source:= TBitmap.Create();
Dir:= ExtractFilePath(ParamStr(0));
try
Source.LoadFromFile(Dir + 'Image.bmp');
SplitBitmapVert(Source, N, Dir);
SplitBitmapHorz(Source, N, Dir);
finally
Source.Free();
end;
WriteLn(' Bitmap is splitted to ', N, 'parts. Press "Enter" to exit...');
ReadLn;
end.
Проверил, работает.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 25 марта 2009, 18:58 [#4]:
Цитата:
и ещё можно всё таки с image, я в него изображение загружаю.
Дык, ёпрст, передавай функциям SplitBitmapVert() и SplitBitmapHorz() в качестве параметра ABitmap свойство Image.Picture.Bitmap и всё!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
GAZ (статус: Посетитель), 25 марта 2009, 19:52 [#5]:
min@y™
Респект и Уважуха.Репутация +1 по любому.Брат про обещание по Вопрос # 2 559 не забудь.
|
|
min@y™ (статус: Доктор наук), 25 марта 2009, 21:06 [#6]:
Цитата:
Брат про обещание по Вопрос # 2 559 не забудь.
Обещание сдержал.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|