求图像缩放算法

milong 2007-05-09 07:43:33
有谁做过图像缩放算法吗?不是用StretchBlt直接放大的
...全文
473 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tufaqing 2007-05-10
  • 打赏
  • 举报
回复
#include <windows.h>

#define HIGH 255
#define LOW 0
#define WIDTHBYTES(bits) ((DWORD)(((bits)+31) & (~31)) / 8)

int Scale(BYTE* image_in, BYTE* image_out, int bit_count, int xsize_in, int ysize_in, int xsize_out, int ysize_out)
{
int i, j, k, m, n;
float x, y, p, q;
unsigned long d, t;

float zx = xsize_out / (float)xsize_in;
float zy = ysize_out / (float)ysize_in;

int pixel_bytes = bit_count / 8;

memset(image_out, 0, WIDTHBYTES(xsize_out * bit_count) * ysize_out);

if(bit_count < 24) // 24位以下不处理
{
return -1;
}

for(j = 0; j < ysize_out; j++)
{
for(i = 0; i < xsize_out; i++)
{
y = j / zy;
x = i / zx;

m = (int) y;
n = (int) x;

q = y - m;
p = x - n;
if(q >= 1)
{
q -= 1; m += 1;
}
if(p >= 1)
{
p -= 1; n += 1;
}

if(m >= 0 && m < ysize_in - 1 && n >= 0 && n < xsize_in - 1)
{
d = 0;
for(k = 0; k < pixel_bytes; k++)
{
t = (unsigned long) ((1 - q) * ((1 - p) * *(image_in + m * WIDTHBYTES(xsize_in * bit_count) + pixel_bytes * n + k) +
p * *(image_in + m * WIDTHBYTES(xsize_in * bit_count) + pixel_bytes * (n + 1) + k)) +
q * ((1 - p) * *(image_in + (m + 1) * WIDTHBYTES(xsize_in * bit_count) + pixel_bytes * n + k) +
p * *(image_in + (m + 1) * WIDTHBYTES(xsize_in * bit_count) + pixel_bytes * (n + 1) + k)));

if(t < LOW)
t = LOW;
else if(t > HIGH)
t = HIGH;

d |= t << (8 * k);
}

}
else
d = LOW;

for(k = 0; k < pixel_bytes; k++)
{
*(image_out + j * WIDTHBYTES(xsize_out * bit_count) + pixel_bytes * i + k) = (BYTE) (d & 0xff);
d >>= 8;
}
}
}

return 0;
}
Rock_And_Roll 2007-05-10
  • 打赏
  • 举报
回复
StretchBlt 也许就是插值算法。
圆圆木公 2007-05-10
  • 打赏
  • 举报
回复
用逆运算的方法,把求后的象素矩阵对应到原来图像中相应的象素矩阵.逆向运算
milong 2007-05-10
  • 打赏
  • 举报
回复
谢谢了,去试试。。:)
Y___Y 2007-05-09
  • 打赏
  • 举报
回复
一般来说可用插值,一次的,二次的均可

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧