这是PIL中的一个基本转换问题.在过去的几年里,我已经尝试了至少几次来正确实现这一点,而且似乎在PIL中我没有完全了解Image.transform.我想实现相似变换(或仿射变换),我可以清楚地说明图像的极限.为了确保我的方法有效,我在Matlab中实现了它.
Matlab实现如下:
im = imread('test.jpg');
y = size(im,1);
x = size(im,2);
angle = 45*3.14/180.0;
xextremes = [rot_x(angle,0,0),rot_x(angle,0,y-1),rot_x(angle,x-1,0),rot_x(angle,x-1,y-1)];
yextremes = [rot_y(angle,0,0),rot_y(angle,0,y-1),rot_y(angle,x-1,0),rot_y(angle,x-1,y-1)];
m = [cos(angle) sin(angle) -min(xextremes); -sin(angle) cos(angle) -min(yextremes); 0 0 1];
tform = maketform('affine',m')
round( [max(xextremes)-min(xextremes), max(yextremes)-min(yextremes)])
im = imtransform(im,tform,'bilinear','Size',round([max(xextremes)-min(xextremes), max(yextremes)-min(yextremes)]));
imwrite(im,'output.jpg');
function y = rot_x(angle,ptx,pty),
y = cos(angle)*ptx + sin(angle)*pty
function y = rot_y(angle,ptx,pty),
y = -sin(angle)*ptx + cos(angle)*pty
Run Code Online (Sandbox Code Playgroud)
这按预期工作.这是输入:

这是输出:

这是实现相同转换的Python/PIL代码:
import Image
import math
def rot_x(angle,ptx,pty):
return math.cos(angle)*ptx + math.sin(angle)*pty
def rot_y(angle,ptx,pty):
return -math.sin(angle)*ptx + math.cos(angle)*pty
angle …Run Code Online (Sandbox Code Playgroud)
首先看一下下面的代码(在这个代码形状中是基类,而行是派生类)
void drawshapes(shape sarray[],int size)
{
for(int i=0;i< size; i++)
sarray[i].draw();
}
main()
{
line larray[10];
larray[0]=line(p1,p2);//assuming that we have a point class
larray[1]=line(p2,p3);
..........
drawshapes(larray,10);
}
Run Code Online (Sandbox Code Playgroud)
当我们编译这个程序时,首先会调用shape的draw方法,然后程序终止.为什么它会终止?为什么我们不能在没有基类指针或引用的情况下实现多态性这是什么技术原因?如果我们试图用对象数组实现多态,那么编译器会做什么?请用例子以可理解的方式解释.我会非常感激的.