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