12 / 11 / 3
Регистрация: 12.10.2010
Сообщений: 268
1

Рисунки

30.12.2011, 21:53. Показов 1446. Ответов 3
Метки нет (Все метки)

Доброго всем вечера . Меня интересует такой вопрос , как правильно масштабировать рисунок ?
Всех с наступающим Новым Годом
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.12.2011, 21:53
Ответы с готовыми решениями:

Рисунки в Delphi
как сделать анимированные рисунки?

Рисунки на кнопках
Всем привет, у меня вопрос как вставлять картинки в кнопки? как показано на скринах)

Как прорисовать остальные рисунки?
Привет хакерам!! Вот маленький вопросик - Как прорисовать остальные рисунки?

Рисунки машинки и бокала с трубочкой
Очень нужны готовые рисунки машинки и бокала с трубочкой(трубочка внутри бокала). Или очень...

3
1904 / 1015 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
30.12.2011, 23:26 2
Цитата Сообщение от tipo4ek Посмотреть сообщение
Меня интересует такой вопрос , как правильно масштабировать рисунок
Смотря какой рисунок, и как он рисуется.
Если говорить про общий случай для загружаемых из файлов картинок, то - применять интерполяции.
пример с иннета
При увеличении изображения нужно находить цвет точек, находящимися междуточками исходного изображения. Функция CopyRect, встроенная в Delphi берет
для этого цвет ближайшей точки. Увеличенное изображение получается некрасивым.
Чтобы избежать этого, используют интерполяцию.
Существует несколько видов интерполяции изображения. Наиболее простой из них - билинейный.

Изображение рассматривается как поверхность, цвет - третье измерение.
Если изображение цветное, то интерполяция проводится отдельно для трех цветов.
Для каждой точки нового изображения с координатами (xo,yo)
нужно найти четыре ближайшие точки исходного изображения.
Эти точки образуют квадрат. Через две верхние точки проводится прямая f1(x),
через две нижние - f2(x). Дальше находятся координаты для точек f1(xo) и f2(xo),
через которые проводится третья прямая f3(y). Цвет искомой точки - это f3(yo).

Этот алгоритм хорошо работает при целых или больших коэффициентах увеличения.
Но резкие границы размываются. Для уменьшения изображения этот алгоритм также не подходит.
Эта программа при нажатии на Button1 увеличивает часть изображения на экране,
а при нажатии на Button2 увеличивает открытое изображение.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
procedure Interpolate(var bm: TBitMap; dx, dy: single);
var
bm1: TBitMap;
z1, z2: single;
k, k1, k2: single;
x1, y1: integer;
c: array [0..1, 0..1, 0..2] of byte;
res: array [0..2] of byte;
x, y: integer;
xp, yp: integer;
xo, yo: integer;
col: integer;
pix: TColor;
begin
bm1 := TBitMap.Create;
bm1.Width := round(bm.Width * dx);
bm1.Height := round(bm.Height * dy);
for y := 0 to bm1.Height - 1 do begin
   for x := 0 to bm1.Width - 1 do begin
     xo := trunc(x / dx);
     yo := trunc(y / dy);
     x1 := round(xo * dx);
     y1 := round(yo * dy);
 
     for yp := 0 to 1 do
       for xp := 0 to 1 do begin
         pix := bm.Canvas.Pixels[xo + xp, yo + yp];
         c[xp, yp, 0] := GetRValue(pix);
         c[xp, yp, 1] := GetGValue(pix);
         c[xp, yp, 2] := GetBValue(pix);
       end;
 
     for col := 0 to 2 do begin
       k1 := (c[1,0,col] - c[0,0,col]) / dx;
       z1 := x * k1 + c[0,0,col] - x1 * k1;
       k2 := (c[1,1,col] - c[0,1,col]) / dx;
       z2 := x * k2 + c[0,1,col] - x1 * k2;
       k := (z2 - z1) / dy;
       res[col] := round(y * k + z1 - y1 * k);
     end;
     bm1.Canvas.Pixels[x,y] := RGB(res[0], res[1], res[2]);
   end;
   Form1.Caption := IntToStr(round(100 * y / bm1.Height)) + '%';
   Application.ProcessMessages;
   if Application.Terminated then Exit;
end;
bm := bm1;
end;
 
const
dx = 5.5;
dy = 5.5;
 
procedure TForm1.Button1Click(Sender: TObject);
const
w = 50;
h = 50;
var
bm: TBitMap;
can: TCanvas;
begin
bm := TBitMap.Create;
can := TCanvas.Create;
can.Handle := GetDC(0);
bm.Width := w;
bm.Height := h;
bm.Canvas.CopyRect(Bounds(0, 0, w, h), can, Bounds(0, 0, w, h));
ReleaseDC(0, can.Handle);
Interpolate(bm, dx, dy);
Form1.Canvas.Draw(0, 0, bm);
Form1.Caption := 'x: ' + FloatToStr(dx) +
   ' y: ' + FloatToStr(dy) +
   ' width: ' + IntToStr(w) +
   ' height: ' + IntToStr(h);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
bm: TBitMap;
begin
if OpenDialog1.Execute then
   bm.LoadFromFile(OpenDialog1.FileName);
Interpolate(bm, dx, dy);
Form1.Canvas.Draw(0, 0, bm);
Form1.Caption := 'x: ' + FloatToStr(dx) +
   ' y: ' + FloatToStr(dy) +
   ' width: ' + IntToStr(bm.Width) +
   ' height: ' + IntToStr(bm.Height);
end;
 
 
Эта программа строит заданные графики, используя модуль Recognition. 
От констант left и right зависит диапазон x, от YScale зависит масштаб по y, а от k зависит качество прорисовки. 
uses Recognition;
 
procedure TForm1.Button1Click(Sender: TObject);
const
left = -10;
right = 10;
YScale = 50;
k = 10;
var
i: integer;
Num: extended;
s: String;
XScale: single;
col: TColor;
begin
s := Edit1.Text;
preparation(s, ['x']);
XScale := PaintBox1.Width / (right - left);
randomize;
col := RGB(random(100), random(100), random(100));
for i := round(left * XScale * k) to round(right * XScale * k) do
   if recogn(ChangeVar(s, 'x', i / XScale / k), Num) then
     PaintBox1.Canvas.Pixels[round(i / k - left * XScale),
       round(PaintBox1.Height / 2 - Num * YScale)] := col;
end;
0
12 / 11 / 3
Регистрация: 12.10.2010
Сообщений: 268
31.12.2011, 01:26  [ТС] 3
У меня есть уравнение . С помощью численных методов я его решаю . Мне нужно , что бы рисунок масштабировался в зависимости от результатов какого численного метода .
0
1904 / 1015 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
31.12.2011, 02:15 4
tipo4ek, а, так тебе график рисовать надо?
Ну если так, то, полагаю, ты его выводишь через Canvas. То есть по такому принципу:
Delphi
1
2
Image.Canvas.MoveTo(X1, Y1);
Image.Canvas.LineTo(X2, Y2);
где х1, у1, х2, у2 - это координаты, которые у тебя там в процедуре пририсовки подставляются.
Чтобы масштабировать, надо всего лишь домножать координаты на какое-то число, которое будет задавать масштаб. Например, это вещественное число, вводимое в Edit; тогда:
Delphi
1
2
Image.Canvas.MoveTo(Round(StrToFloat(Edit1.Text) * X1), Round(StrToFloat(Edit1.Text) * Y1));
Image.Canvas.LineTo(Round(StrToFloat(Edit1.Text) * X2), Round(StrToFloat(Edit1.Text) * Y2));
То есть введёшь в Edit 1,5 - график увеличится в полтора раза. Ну и так далее, принцип, думаю, понятен.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.12.2011, 02:15
Помогаю со студенческими работами здесь

Удалить все рисунки из документа Word
Имеется большое количество документов doc размером около 30 Мб. Мне нужно программно почистить эти...

как рисовать рисунки в Delphi combobox
Здравствуйте уважаемые программисты! Прошу помочь моему сыну по программированию... Ему дали...

При выборе в СomboBox открывать рисунки в Image
как можно сделать так чтобы при выборе с СomboBox открывались рисунки в одном Image!!! ??? помогите...

Грид, в котором помимо текста в одних колонках были бы рисунки в других
Мне надо на форме разместить грид, в котором помимо текста в одних колонках были рисунки в других....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru