Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 552

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Как картинку в image разбить на n-одинаковых частей и сохранить эти части с именем соотвествующему номеру каждой части картинке.

GAZ Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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 дней с момента отправки ответа)

Приложение:
  1.  
  2.  
  3. program p2552;
  4.  
  5. {$APPTYPE CONSOLE}
  6.  
  7. uses
  8. Windows, SysUtils, Graphics;
  9.  
  10. procedure SplitBitmap(ABitmap: TBitmap; const N: Integer; const ADir: string);
  11. var
  12. Temp: TBitmap;
  13. Index: Integer;
  14. FileName: string;
  15. begin
  16. Temp:= TBitmap.Create();
  17. Temp.Width:= ABitmap.Width;
  18. Temp.Height:= ABitmap.Height div N;
  19. try
  20. for Index:= 0 to N - 1 do
  21. begin
  22. BitBlt(Temp.Canvas.Handle, 0, 0, Temp.Width, Temp.Height,
  23. ABitmap.Canvas.Handle, 0, Index * Temp.Height, SRCCOPY);
  24. FileName:= IncludeTrailingPathDelimiter(ADir) + 'Part' + IntToStr(Index + 1) + '.bmp';
  25. Temp.SaveToFile(FileName);
  26. end;
  27. finally
  28. Temp.Free();
  29. end;
  30. end;
  31.  
  32. var
  33. Source: TBitmap;
  34. Dir: string;
  35.  
  36. const
  37. N = 4;
  38.  
  39. begin
  40. Source:= TBitmap.Create();
  41. Dir:= ExtractFilePath(ParamStr(0));
  42. try
  43. Source.LoadFromFile(Dir + 'Image.bmp');
  44. SplitBitmap(Source, N, Dir);
  45. finally
  46. Source.Free();
  47. end;
  48.  
  49. WriteLn(' Bitmap is splitted to ', N, 'parts. Press "Enter" to exit...');
  50. ReadLn;
  51. end.
  52.  


Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 23 марта 2009, 09:43
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 25 марта 2009, 21:06; участников в обсуждении: 2.
GAZ

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

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™

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™

min@y™ (статус: Доктор наук), 25 марта 2009, 18:58 [#4]:

Цитата:


и ещё можно всё таки с image, я в него изображение загружаю.


Дык, ёпрст, передавай функциям SplitBitmapVert() и SplitBitmapHorz() в качестве параметра ABitmap свойство Image.Picture.Bitmap и всё!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
GAZ

GAZ (статус: Посетитель), 25 марта 2009, 19:52 [#5]:

min@y™
Респект и Уважуха.Репутация +1 по любому.Брат про обещание по Вопрос # 2 559 не забудь.
min@y™

min@y™ (статус: Доктор наук), 25 марта 2009, 21:06 [#6]:

Цитата:

Брат про обещание по Вопрос # 2 559 не забудь.


Обещание сдержал.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:56
Выполнено за 0.03 сек.