-
Notifications
You must be signed in to change notification settings - Fork 0
/
cdecorator_scale.cpp
105 lines (102 loc) · 4.09 KB
/
cdecorator_scale.cpp
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
#include "cdecorator_scale.h"
//----------------------------------------------------------------------------------------------------
//êîíñòðóêòîð
//----------------------------------------------------------------------------------------------------
CDecorator_Scale::CDecorator_Scale(CIImage *cIImage_Set_Ptr,unsigned long NewWidth,unsigned long NewHeight):CDecorator_CIImage(cIImage_Set_Ptr)
{
Width=NewWidth;
Height=NewHeight;
}
//----------------------------------------------------------------------------------------------------
//äåñòðóêòîð
//----------------------------------------------------------------------------------------------------
CDecorator_Scale::~CDecorator_Scale()
{
}
//----------------------------------------------------------------------------------------------------
//ïîëó÷èòü RGBA èçîáðàæåíèå
//----------------------------------------------------------------------------------------------------
void CDecorator_Scale::GetRGBAImage(unsigned long &width,unsigned long &height,vector<unsigned long> &vector_image)
{
//ñîçäà¸ì óâåëè÷åííîå èçîáðàæåíèå
vector<unsigned long> vector_oldimage;//äàííûå èçîáðàæåíèÿ
//çàïðàøèâàåì èçîáðàæåíèå
CDecorator_CIImage::GetRGBAImage(width,height,vector_oldimage);
//ïðîèçâîäèì ìàñøòàáèðîâàíèå
unsigned long x;
unsigned long y;
vector_image.resize(Width*Height);
unsigned long *i_ptr=&(vector_image[0]);
unsigned long *oldi_ptr=&(vector_oldimage[0]);
for(y=0;y<Height;y++)
{
float tmp=static_cast<float>(y)/static_cast<float>(Height-1)*static_cast<float>(height-1);
long ys=static_cast<long>(floor(tmp));
if (ys<0) ys=0;
if (ys>=height-1) ys=height-2;
float u=tmp-ys;
for(x=0;x<Width;x++,i_ptr++)
{
float tmp=static_cast<float>(x)/static_cast<float>(Width-1)*static_cast<float>(width-1);
long xs=static_cast<long>(floor(tmp));
if (xs<0) xs=0;
if (xs>=width-1) xs=width-2;
float v=tmp-xs;
//êîýôôèöèåíòû
float d1=(1-v)*(1-u);
float d2=v*(1-u);
float d3=v*u;
float d4=(1-v)*u;
//îêðåñòíûå ïèêñåëè
unsigned long p1=oldi_ptr[xs+ys*width];
unsigned long p2=oldi_ptr[xs+1+ys*width];
unsigned long p3=oldi_ptr[xs+1+(ys+1)*width];
unsigned long p4=oldi_ptr[xs+(ys+1)*width];
//âû÷èñëÿåì íîâîå çíà÷åíèå ïèêñåëÿ
unsigned long color=0;
unsigned long mask=0xFF;
unsigned long offset=0;
for(unsigned char k=0;k<4;k++,mask<<=8,offset+=8)
{
unsigned long kp1=(p1&mask)>>offset;
unsigned long kp2=(p2&mask)>>offset;
unsigned long kp3=(p3&mask)>>offset;
unsigned long kp4=(p4&mask)>>offset;
unsigned long c=static_cast<short>(kp1*d1+kp2*d2+kp3*d3+kp4*d4);
if (c>=0xFF) c=0xFF;
color|=(c<<offset);
}
*i_ptr=color;
}
}
width=Width;
height=Height;
}
//----------------------------------------------------------------------------------------------------
//çàäàòü RGBA èçîáðàæåíèå
//----------------------------------------------------------------------------------------------------
void CDecorator_Scale::SetRGBAImage(unsigned long &width,unsigned long &height,vector<unsigned long> &vector_image)
{
CDecorator_CIImage::SetRGBAImage(width,height,vector_image);
}
//----------------------------------------------------------------------------------------------------
//çàäàòü ðàçìåð èçîáðàæåíèÿ
//----------------------------------------------------------------------------------------------------
void CDecorator_Scale::SetSize(unsigned long width,unsigned long height)
{
CDecorator_CIImage::SetSize(width,height);
}
//----------------------------------------------------------------------------------------------------
//çàäàòü òî÷êó
//----------------------------------------------------------------------------------------------------
void CDecorator_Scale::SetRGBAPixel(unsigned long x,unsigned long y,unsigned long color)
{
CDecorator_CIImage::SetRGBAPixel(x,y,color);
}
//----------------------------------------------------------------------------------------------------
//ïîëó÷èòü òî÷êó
//----------------------------------------------------------------------------------------------------
unsigned long CDecorator_Scale::GetRGBAPixel(unsigned long x,unsigned long y)
{
return(CDecorator_CIImage::GetRGBAPixel(x,y));
}