|
Вопрос # 639/ вопрос решён / |
|
Здравствуйте, уважаемые эксперты!Я наверно достал всех со своим графическим редактором.Но мне надо добавить на панель инструментов лупу которая увеличивает рисунок и наоборот уменьшает но не с помощью оператаров strech и proportional как мне это сделать?
 |
Вопрос задал: Аксион (статус: 4-ый класс)
Вопрос отправлен: 18 июня 2007, 13:07
Состояние вопроса: решён, ответов: 2.
|
Ответ #1. Отвечает эксперт: Градов Ю.М.
Здравствуйте, ММО!
Высылаю Вам часть кода, вспомогательный код могу выслать, если необходимо:
Приложение: Переключить в обычный режим- var
- Srect, Drect, PosForme: TRect;
- iWidth, iHeight, DmX, DmY: Integer;
- iTmpX, iTmpY: Real;
- C: TCanvas;
- Kursor: TPoint;
-
- ...
-
- if not IsIconic(Application.Handle) then
- begin
- GetCursorPos(Kursor);
- PosForme := Rect(Form1.Left, Form1.Top, Form1.Left + Form1.Width, Form1.Top + Form1.Height);
- if not PtInRect(PosForme, Kursor) then
- begin
- iWidth := Image1.Width;
- iHeight := Image1.Height;
- Drect := Bounds(0, 0, iWidth, iHeight);
- iTmpX := iWidth / (Slider.Position * 4);
- iTmpY := iHeight / (Slider.Position * 4);
- Srect:=
- Rect(Kursor.x, Kursor.y, Kursor.x, Kursor.y);
- InflateRect(Srect, Round(iTmpX), Round(iTmpY));
- C := TCanvas.Create;
- try
- C.Handle := GetDC(GetDesktopWindow);
- Image1.Canvas.CopyRect(Drect, C, Srect);
- finally
- C.Free;
- end;
- end;
- Windows.Application.ProcessMessages;
- end;
-
 |
Ответ отправил: Градов Ю.М. (статус: 8-ой класс)
Время отправки: 18 июня 2007, 22:00
Оценка за ответ: 5
|
Ответ #2. Отвечает эксперт: min@y™
Скачай себе базу знаний Delphi World (ещё раз советую). Там много интересного. Вот, к примеру, я там нашёл такую вещь (см. приложение):
Приложение: Переключить в обычный режим- {
- This function resizes a bitmap calculating the average color of a rectangular
- area of pixels from source bitmap to a pixel or a rectangular area to target
- bitmap.
-
- It produces a soft-color and undistorsioned result image unlike the StretchDraw
- method
-
- I think that this method have a tenichal name, but I am not sure.
-
- As you can see, this function could be very optimized :p
- }
-
- procedure TFormConvertir.ResizeBitmap(imgo, imgd: TBitmap; nw, nh: Integer);
- var
- xini, xfi, yini, yfi, saltx, salty: single;
- x, y, px, py, tpix: integer;
- PixelColor: TColor;
- r, g, b: longint;
-
- function MyRound(const X: Double): Integer;
- begin
- Result := Trunc(x);
- if Frac(x) >= 0.5 then
- if x >= 0 then Result := Result + 1
- else
- Result := Result - 1;
- // Result := Trunc(X + (-2 * Ord(X < 0) + 1) * 0.5);
- end;
-
- begin
- // Set target size
-
- imgd.Width := nw;
- imgd.Height := nh;
-
- // Calcs width & height of every area of pixels of the source bitmap
-
- saltx := imgo.Width / nw;
- salty := imgo.Height / nh;
-
-
- yfi := 0;
- for y := 0 to nh - 1 do
- begin
- // Set the initial and final Y coordinate of a pixel area
-
- yini := yfi;
- yfi := yini + salty;
- if yfi >= imgo.Height then yfi := imgo.Height - 1;
-
- xfi := 0;
- for x := 0 to nw - 1 do
- begin
- // Set the inital and final X coordinate of a pixel area
-
- xini := xfi;
- xfi := xini + saltx;
- if xfi >= imgo.Width then xfi := imgo.Width - 1;
-
-
- // This loop calcs del average result color of a pixel area
- // of the imaginary grid
-
- r := 0;
- g := 0;
- b := 0;
- tpix := 0;
-
- for py := MyRound(yini) to MyRound(yfi) do
- begin
- for px := MyRound(xini) to MyRound(xfi) do
- begin
- Inc(tpix);
- PixelColor := ColorToRGB(imgo.Canvas.Pixels[px, py]);
- r := r + GetRValue(PixelColor);
- g := g + GetGValue(PixelColor);
- b := b + GetBValue(PixelColor);
- end;
- end;
-
- // Draws the result pixel
-
- imgd.Canvas.Pixels[x, y] :=
- rgb(MyRound(r / tpix),
- MyRound(g / tpix),
- MyRound(b / tpix)
- );
- end;
- end;
- end;
-
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 19 июня 2007, 08:14
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 7; последнее сообщение — 19 июня 2007, 12:41; участников в обсуждении: 4.
|
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 ??
|
|
Градов Ю.М. (статус: 8-ой класс), 19 июня 2007, 12:41 [#7]:
На сайте Link есть программа DelphiWorld6. Установить ее. В ней есть режим обновления баз данных.
|
31 января 2011, 19:27: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|