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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 639

/ вопрос решён /

Здравствуйте, уважаемые эксперты!Я наверно достал всех со своим графическим редактором.Но мне надо добавить на панель инструментов лупу которая увеличивает рисунок и наоборот уменьшает но не с помощью оператаров strech и proportional как мне это сделать?

Аксион Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Аксион (статус: 4-ый класс)
Вопрос отправлен: 18 июня 2007, 13:07
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Градов Ю.М.

Здравствуйте, ММО!
Высылаю Вам часть кода, вспомогательный код могу выслать, если необходимо:

Приложение:
  1. var
  2. Srect, Drect, PosForme: TRect;
  3. iWidth, iHeight, DmX, DmY: Integer;
  4. iTmpX, iTmpY: Real;
  5. C: TCanvas;
  6. Kursor: TPoint;
  7.  
  8. ...
  9.  
  10. if not IsIconic(Application.Handle) then
  11. begin
  12. GetCursorPos(Kursor);
  13. PosForme := Rect(Form1.Left, Form1.Top, Form1.Left + Form1.Width, Form1.Top + Form1.Height);
  14. if not PtInRect(PosForme, Kursor) then
  15. begin
  16. iWidth := Image1.Width;
  17. iHeight := Image1.Height;
  18. Drect := Bounds(0, 0, iWidth, iHeight);
  19. iTmpX := iWidth / (Slider.Position * 4);
  20. iTmpY := iHeight / (Slider.Position * 4);
  21. Srect:=
  22. Rect(Kursor.x, Kursor.y, Kursor.x, Kursor.y);
  23. InflateRect(Srect, Round(iTmpX), Round(iTmpY));
  24. C := TCanvas.Create;
  25. try
  26. C.Handle := GetDC(GetDesktopWindow);
  27. Image1.Canvas.CopyRect(Drect, C, Srect);
  28. finally
  29. C.Free;
  30. end;
  31. end;
  32. Windows.Application.ProcessMessages;
  33. end;
  34.  


Ответ отправил: Градов Ю.М. (статус: 8-ой класс)
Время отправки: 18 июня 2007, 22:00
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: min@y™

Скачай себе базу знаний Delphi World (ещё раз советую). Там много интересного. Вот, к примеру, я там нашёл такую вещь (см. приложение):

Приложение:
  1. {
  2. This function resizes a bitmap calculating the average color of a rectangular
  3. area of pixels from source bitmap to a pixel or a rectangular area to target
  4. bitmap.
  5.  
  6. It produces a soft-color and undistorsioned result image unlike the StretchDraw
  7. method
  8.  
  9. I think that this method have a tenichal name, but I am not sure.
  10.  
  11. As you can see, this function could be very optimized :p
  12. }
  13.  
  14. procedure TFormConvertir.ResizeBitmap(imgo, imgd: TBitmap; nw, nh: Integer);
  15. var
  16. xini, xfi, yini, yfi, saltx, salty: single;
  17. x, y, px, py, tpix: integer;
  18. PixelColor: TColor;
  19. r, g, b: longint;
  20.  
  21. function MyRound(const X: Double): Integer;
  22. begin
  23. Result := Trunc(x);
  24. if Frac(x) >= 0.5 then
  25. if x >= 0 then Result := Result + 1
  26. else
  27. Result := Result - 1;
  28. // Result := Trunc(X + (-2 * Ord(X < 0) + 1) * 0.5);
  29. end;
  30.  
  31. begin
  32. // Set target size
  33.  
  34. imgd.Width := nw;
  35. imgd.Height := nh;
  36.  
  37. // Calcs width & height of every area of pixels of the source bitmap
  38.  
  39. saltx := imgo.Width / nw;
  40. salty := imgo.Height / nh;
  41.  
  42.  
  43. yfi := 0;
  44. for y := 0 to nh - 1 do
  45. begin
  46. // Set the initial and final Y coordinate of a pixel area
  47.  
  48. yini := yfi;
  49. yfi := yini + salty;
  50. if yfi >= imgo.Height then yfi := imgo.Height - 1;
  51.  
  52. xfi := 0;
  53. for x := 0 to nw - 1 do
  54. begin
  55. // Set the inital and final X coordinate of a pixel area
  56.  
  57. xini := xfi;
  58. xfi := xini + saltx;
  59. if xfi >= imgo.Width then xfi := imgo.Width - 1;
  60.  
  61.  
  62. // This loop calcs del average result color of a pixel area
  63. // of the imaginary grid
  64.  
  65. r := 0;
  66. g := 0;
  67. b := 0;
  68. tpix := 0;
  69.  
  70. for py := MyRound(yini) to MyRound(yfi) do
  71. begin
  72. for px := MyRound(xini) to MyRound(xfi) do
  73. begin
  74. Inc(tpix);
  75. PixelColor := ColorToRGB(imgo.Canvas.Pixels[px, py]);
  76. r := r + GetRValue(PixelColor);
  77. g := g + GetGValue(PixelColor);
  78. b := b + GetBValue(PixelColor);
  79. end;
  80. end;
  81.  
  82. // Draws the result pixel
  83.  
  84. imgd.Canvas.Pixels[x, y] :=
  85. rgb(MyRound(r / tpix),
  86. MyRound(g / tpix),
  87. MyRound(b / tpix)
  88. );
  89. end;
  90. end;
  91. end;
  92.  


Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 19 июня 2007, 08:14
Оценка за ответ: 5


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

Всего сообщений: 7; последнее сообщение — 19 июня 2007, 12:41; участников в обсуждении: 4.
Venom

Venom (статус: 1-ый класс), 18 июня 2007, 14:17 [#1]:

Если интересно, могу скинуть полностью готовый год для масштабирования изображения:
1. Увеличение/уменьшение по клику на n%
2. Увеличение/уменьшение выделенной области с центрированием области.

Но там я использовал strech
Аксион

Аксион (статус: 4-ый класс), 18 июня 2007, 18:24 [#2]:

Скинь
Аксион

Аксион (статус: 4-ый класс), 18 июня 2007, 18:33 [#3]:

просто мне надо на увеличинном изображении рисовать а используя метод strech сами пиксели как бы растягиваются и рисовать не возможно, но в принцепи можешь скинуть вот мой емаил: mik43fe@yandex.ru
Градов Ю.М.

Градов Ю.М. (статус: 8-ой класс), 18 июня 2007, 22:04 [#4]:

Исходник можно взять здесь Link
Аксион

Аксион (статус: 4-ый класс), 19 июня 2007, 12:34 [#5]:

а ГДЕ ДОСТАТЬ базу знаний Delphi World ??
Вадим К

Вадим К (статус: Академик), 19 июня 2007, 12:39 [#6]:

www.delphiworld.narod.ru
Галочка "подтверждения прочтения" - вселенское зло.
Градов Ю.М.

Градов Ю.М. (статус: 8-ой класс), 19 июня 2007, 12:41 [#7]:

На сайте Link есть программа DelphiWorld6. Установить ее. В ней есть режим обновления баз данных.

31 января 2011, 19:27: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

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

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