java 图片放大缩小
2012-08-29 18:01
375 查看
[java] view
plaincopy
package CGameTools;
public class ZoomPixel {
public static int interpolation(int[] imageData, int width, int heigth,
float x, float y) {
// 四个最临近象素的坐标(i1, j1), (i2, j1), (i1, j2), (i2, j2)
int i1, i2;
int j1, j2;
int f1, f2, f3, f4; // 四个最临近象素值
int f12, f34; // 二个插值中间值
f1 = f2 = f3 = f4 = 0;
// 定义一个值,当象素坐标相差小于改值时认为坐标相同
int EXP = 0;
// 计算四个最临近象素的坐标
i1 = (int) x;
i2 = i1 + 1;
j1 = (int) y;
j2 = j1 + 1;
// 根据不同情况分别处理
if ((x < 0) || (x > width - 1) || (y < 0) || (y > heigth - 1)) {
return 0x00ffffff; // 要计算的点不在源图范围内,直接返回255。
} else {
if (Math.abs(x - width + 1) <= EXP) {
// 要计算的点在图像右边缘上
if (Math.abs(y - heigth + 1) <= EXP) {
// 要计算的点正好是图像最右下角那一个象素,直接返回该点象素值
f1 = (int)imageData[width * j1 + i1];
return (int)f1;
} else {
// 在图像右边缘上且不是最后一点,直接一次插值即可
f1 = (int)imageData[width * j1 + i1];
f3 = (int)imageData[width * j1 + i2];
// 返回插值结果
return (int) (f1 + (y - j1) * (f3 - f1));
}
} else if (Math.abs(y - heigth + 1) <= EXP) {
// 要计算的点在图像下边缘上且不是最后一点,直接一次插值即可
f1 = (int)imageData[width * j1 + i1];
f2 = (int)imageData[width * j2 + i1];
// 返回插值结果
return (int) (f1 + (x - i1) * (f2 - f1));
} else {
// 计算四个最临近象素值
f1 = imageData[width * j1 + i1];
f2 = imageData[width * j1 + i2];
f3 = imageData[width * j2 + i1];
f4 = imageData[width * j2 + i2];
// 插值1
f12 = (int)(f1 + (x - i1) * (f2 - f1));
// 插值2
f34 = (int)((f3 + (x - i1) * (f4 - f3)));
// 插值3
return (int)(f12 + (y - j1) * (f34 - f12));
}
}
}
}
下面是例子
处理图片:
[java] view
plaincopy
try {
Image src = Image.createImage("/image.png");
int destW = 400; //缩放后图片的宽度
int destH = 400; //缩放图片的高度
int srcW = src.getWidth();
int srcH = src.getHeight();
// create pixel arrays
int[] destPixels = new int[destW * destH]; // array to hold destination
int[] destRed = new int[destW * destH];
int[] destGreen = new int[destW * destH];
int[] destBlue = new int[destW * destH];
// pixels
int[] srcPixels = new int[srcW * srcH]; // array with source's pixels
int[] srcRed = new int[srcW * srcH];
int[] srcGreen = new int[srcW * srcH];
int[] srcBlue = new int[srcW * srcH];
src.getRGB(srcPixels, 0, srcW, 0, 0, srcW, srcH);
for (int i = 0; i < srcPixels.length; i++) {
srcBlue[i] = srcPixels[i]&0x000000ff;
srcGreen[i] = (srcPixels[i]>>8)&0x000000ff;
srcRed[i] = (srcPixels[i]>>16)&0x000000ff;
}
// simple point smapled resizing
// loop through the destination pixels, find the matching pixel on
// the source and use that
for (int destY = 0; destY < destH; ++destY) {
for (int destX = 0; destX < destW; ++destX) {
float srcX = ((float)destX * (float)srcW) / (float)destW;
float srcY = ((float)destY * (float)srcH) / (float)destH;
try {
destRed[destX + destY * destW] = ZoomPixel.interpolation(srcRed, srcW, srcH, srcX, srcY);
destGreen[destX + destY * destW] = ZoomPixel.interpolation(srcGreen, srcW, srcH, srcX, srcY);
destBlue[destX + destY * destW] = ZoomPixel.interpolation(srcBlue, srcW, srcH, srcX, srcY);
int value = 0xff000000;
value|=destBlue[destX + destY * destW];
value|=(destGreen[destX + destY * destW]<<8);
value|=(destRed[destX + destY * destW]<<16);
destPixels[destX + destY * destW] = value;
} catch (Exception e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
之后用:g.drawRGB(destPixels, 0, destW, 0, 0, destW, destH, false);来绘制。
plaincopy
package CGameTools;
public class ZoomPixel {
public static int interpolation(int[] imageData, int width, int heigth,
float x, float y) {
// 四个最临近象素的坐标(i1, j1), (i2, j1), (i1, j2), (i2, j2)
int i1, i2;
int j1, j2;
int f1, f2, f3, f4; // 四个最临近象素值
int f12, f34; // 二个插值中间值
f1 = f2 = f3 = f4 = 0;
// 定义一个值,当象素坐标相差小于改值时认为坐标相同
int EXP = 0;
// 计算四个最临近象素的坐标
i1 = (int) x;
i2 = i1 + 1;
j1 = (int) y;
j2 = j1 + 1;
// 根据不同情况分别处理
if ((x < 0) || (x > width - 1) || (y < 0) || (y > heigth - 1)) {
return 0x00ffffff; // 要计算的点不在源图范围内,直接返回255。
} else {
if (Math.abs(x - width + 1) <= EXP) {
// 要计算的点在图像右边缘上
if (Math.abs(y - heigth + 1) <= EXP) {
// 要计算的点正好是图像最右下角那一个象素,直接返回该点象素值
f1 = (int)imageData[width * j1 + i1];
return (int)f1;
} else {
// 在图像右边缘上且不是最后一点,直接一次插值即可
f1 = (int)imageData[width * j1 + i1];
f3 = (int)imageData[width * j1 + i2];
// 返回插值结果
return (int) (f1 + (y - j1) * (f3 - f1));
}
} else if (Math.abs(y - heigth + 1) <= EXP) {
// 要计算的点在图像下边缘上且不是最后一点,直接一次插值即可
f1 = (int)imageData[width * j1 + i1];
f2 = (int)imageData[width * j2 + i1];
// 返回插值结果
return (int) (f1 + (x - i1) * (f2 - f1));
} else {
// 计算四个最临近象素值
f1 = imageData[width * j1 + i1];
f2 = imageData[width * j1 + i2];
f3 = imageData[width * j2 + i1];
f4 = imageData[width * j2 + i2];
// 插值1
f12 = (int)(f1 + (x - i1) * (f2 - f1));
// 插值2
f34 = (int)((f3 + (x - i1) * (f4 - f3)));
// 插值3
return (int)(f12 + (y - j1) * (f34 - f12));
}
}
}
}
下面是例子
处理图片:
[java] view
plaincopy
try {
Image src = Image.createImage("/image.png");
int destW = 400; //缩放后图片的宽度
int destH = 400; //缩放图片的高度
int srcW = src.getWidth();
int srcH = src.getHeight();
// create pixel arrays
int[] destPixels = new int[destW * destH]; // array to hold destination
int[] destRed = new int[destW * destH];
int[] destGreen = new int[destW * destH];
int[] destBlue = new int[destW * destH];
// pixels
int[] srcPixels = new int[srcW * srcH]; // array with source's pixels
int[] srcRed = new int[srcW * srcH];
int[] srcGreen = new int[srcW * srcH];
int[] srcBlue = new int[srcW * srcH];
src.getRGB(srcPixels, 0, srcW, 0, 0, srcW, srcH);
for (int i = 0; i < srcPixels.length; i++) {
srcBlue[i] = srcPixels[i]&0x000000ff;
srcGreen[i] = (srcPixels[i]>>8)&0x000000ff;
srcRed[i] = (srcPixels[i]>>16)&0x000000ff;
}
// simple point smapled resizing
// loop through the destination pixels, find the matching pixel on
// the source and use that
for (int destY = 0; destY < destH; ++destY) {
for (int destX = 0; destX < destW; ++destX) {
float srcX = ((float)destX * (float)srcW) / (float)destW;
float srcY = ((float)destY * (float)srcH) / (float)destH;
try {
destRed[destX + destY * destW] = ZoomPixel.interpolation(srcRed, srcW, srcH, srcX, srcY);
destGreen[destX + destY * destW] = ZoomPixel.interpolation(srcGreen, srcW, srcH, srcX, srcY);
destBlue[destX + destY * destW] = ZoomPixel.interpolation(srcBlue, srcW, srcH, srcX, srcY);
int value = 0xff000000;
value|=destBlue[destX + destY * destW];
value|=(destGreen[destX + destY * destW]<<8);
value|=(destRed[destX + destY * destW]<<16);
destPixels[destX + destY * destW] = value;
} catch (Exception e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
之后用:g.drawRGB(destPixels, 0, destW, 0, 0, destW, destH, false);来绘制。
相关文章推荐
- android点击实现图片放大缩小 - java技术博客
- JAVA图片处理放大缩小
- java 图片放大缩小
- JAVA工具类之图片处理(放大、缩小)
- Java图片处理方法——放大、缩小、切割
- java 图片的放大与缩小--等距采样算法
- java 放大缩小图片
- 通过Java代码实现图片的放大和缩小
- java对图片任意大小的缩小放大操作
- 通过Java代码实现图片的放大和缩小
- 使用Matrix放大或缩小图片
- 基于RxPaparazzo实现图片裁剪、图片旋转、比例放大缩小功能
- android点击实现图片放大缩小
- ExtJs 完美实现图片在Window窗口中通过鼠标滚轮放大缩小以及点击拖拽
- 实现类似于QQ空间相册的点击图片放大,再点后缩小回原来位置
- JS控制图片拖动 放大 缩小 旋转 支持滚轮放大缩小 IE有效
- 图片的放大与缩小
- 鼠标滚轮 放大缩小图片
- (纯代码)图片移动放大缩小:
- 动态放大缩小ImageView里的图片……运用Matrix对象来缩放图片文件