是否有任何方法或外部库可以使用Lanczos(理想情况下)或至少bicubic alg 调整图像大小.Android下?(当然更快更好,但质量优先,处理时间次要)
我到目前为止所做的一切都是这样的:
Bitmap resized = Bitmap.createScaledBitmap(yourBitmap, newWidth, newHeight, true);
Run Code Online (Sandbox Code Playgroud)
然而,它使用双线性滤波器,输出质量很差.特别是如果你想保留细节(如细线或可读文本).
有许多优秀的Java库,例如这里讨论的: Java - 调整图像大小而不会降低质量
但是它总是依赖于Java awt类java.awt.image.BufferedImage,所以它不能在Android中使用.
有没有办法如何更改Bitmap.createScaledBitmap()方法或某些库中的默认(双线性)过滤器,如Morten Nobel的lib,它能够与android.graphics.Bitmap类一起工作(或者有一些原始表示,如评论中指出的@Tron)?
我想在尺寸大于它的画布上绘制位图.我可以使用canvas.drawBitmap(bitmap,null,destRect,null); 但是如果源图像比目标矩形小得多,则结果是像素化的,质量很差.
如何使用双线性或双三次重采样绘制我的位图?
任何帮助将不胜感激,thanx.
我正在编写一些以不同速度播放WAV文件的代码,因此波浪要么慢,要么低音,要么更快,音高更高.我目前正在使用简单的线性插值,如下所示:
int newlength = (int)Math.Round(rawdata.Length * lengthMultiplier);
float[] output = new float[newlength];
for (int i = 0; i < newlength; i++)
{
float realPos = i / lengthMultiplier;
int iLow = (int)realPos;
int iHigh = iLow + 1;
float remainder = realPos - (float)iLow;
float lowval = 0;
float highval = 0;
if ((iLow >= 0) && (iLow < rawdata.Length))
{
lowval = rawdata[iLow];
}
if ((iHigh >= 0) && (iHigh < rawdata.Length))
{
highval = rawdata[iHigh];
}
output[i] = …Run Code Online (Sandbox Code Playgroud) 我试图在HTML5画布中制作像素艺术主题游戏,作为其中的一部分,我拍摄10x20左右的大小图像,并使用以下代码将它们绘制到画布上:
ctx.drawImage(image, 20, 20, 100, 200);
Run Code Online (Sandbox Code Playgroud)
然而,画布使用双三次图像缩放,因此像素艺术图像在2x及以上时看起来很糟糕.有没有办法强制画布使用最近邻居缩放或可能使用自定义方法来缩放图像?如果不是这意味着图像必须预先在像Paint.net这样的东西上缩放?
下面是一个三次插值函数:
public float Smooth(float start, float end, float amount)
{
// Clamp to 0-1;
amount = (amount > 1f) ? 1f : amount;
amount = (amount < 0f) ? 0f : amount;
// Cubicly adjust the amount value.
amount = (amount * amount) * (3f - (2f * amount));
return (start + ((end - start) * amount));
}
Run Code Online (Sandbox Code Playgroud)
该函数将在起始值和结束值之间进行立方插值,给定量在0.0f - 1.0f之间.如果你要绘制这条曲线,你最终会得到这样的结果:
已过期Imageshack图像已删除
这里的三次函数是:
amount = (amount * amount) * (3f - (2f * amount));
Run Code Online (Sandbox Code Playgroud)
如何进行调整以产生两个切入的切线?
生成这样的曲线:(线性开始到立方结束)
已过期Imageshack图像已删除
作为一个功能
并像这样另一个:(立方开始线性结束)
已过期Imageshack图像已删除 …
我想知道是否有人有完整的,工作的和有效的代码来在glsl中进行双三次纹理过滤.有这样的:
http://www.codeproject.com/Articles/236394/Bi-Cubic-and-Bi-Linear-Interpolation-with-GLSL 或 https://github.com/visionworkbench/visionworkbench/blob/master/src/vw/ GPU /着色器/口译/插值bicubic.glsl
但是它们都进行了16次纹理读取,其中只需要4次:
https://groups.google.com/forum/#!topic/comp.graphics.api.opengl/kqrujgJfTxo
然而,上面的方法使用了一个缺少的"cubic()"函数,我不知道它应该做什么,还需要一个无法解释的"texscale"参数.
还有NVidia版本:
http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter20.html
但我相信这会使用CUDA,这是专门针对NVidia的卡片.我需要glsl.
我可以将nvidia版本移植到glsl,但我想先问一下是否有人已经有一个完整的,工作的glsl bicubic着色器.
我正在尝试编写一个基本的双三次调整大小算法来调整24位RGB位图的大小.我对所涉及的数学有一般性的了解,并且我正在使用Google Code的这个实现作为指导.我这里没有使用任何外部库 - 我只是在尝试算法本身.位图表示为plain std::vector<unsigned char>:
inline unsigned char getpixel(const std::vector<unsigned char>& in,
std::size_t src_width, std::size_t src_height, unsigned x, unsigned y, int channel)
{
if (x < src_width && y < src_height)
return in[(x * 3 * src_width) + (3 * y) + channel];
return 0;
}
std::vector<unsigned char> bicubicresize(const std::vector<unsigned char>& in,
std::size_t src_width, std::size_t src_height, std::size_t dest_width, std::size_t dest_height)
{
std::vector<unsigned char> out(dest_width * dest_height * 3);
const float tx = …Run Code Online (Sandbox Code Playgroud) 我正在使用双三次插值算法来升高高度图,我注意到像素边界周围的一些伪像.但是,当我使用简单的三次插值(样条曲线)时,这些伪像似乎不会出现.
可能是因为双三次插值不能保证二阶导数是连续的,不像三次样条?如果是这样,是否有已知的算法具有连续的二阶导数?否则,有没有办法处理这些工件?
线性插值(显示像素边界):

双立方插值(在像素边界处可见的伪像):

立方插值(无明显伪影):

我尝试了几个双三元公式,这给了我相同的结果.这里有些例子:
编辑:我进行了一些搜索,发现B-Spline有一个连续的C2(也是Bharat建议的).我实现了它,它看起来很好,即使它是一个近似而不是插值(它没有通过样本).
B样条(近似值):

我一直在尝试为内存位图编写双三次调整大小算法。我熟悉双三次插值的工作原理,并且我使用维基百科文章和现有实现作为编写我自己的版本的指南。
下面是我的简单实现。这里,bmap是vector包含位图数据的get_subpixel函数,它是将位图视为由X x Y x Channel像素组成的 3D 数组,并返回指定坐标处的单个子像素。
std::vector<unsigned char> bicubic_resize(
std::vector<unsigned char>& bmap, std::size_t bmap_width, std::size_t bmap_height,
std::size_t channels, std::size_t dest_width, std::size_t dest_height)
{
std::vector<unsigned char> out(dest_width * dest_height * 3);
const double tx = double(bmap_width) / dest_width;
const double ty = double(bmap_height) / dest_height;
const std::size_t row_stride = dest_width * channels;
unsigned char C[5] = { 0 };
for (unsigned i = 0; i < dest_height; …Run Code Online (Sandbox Code Playgroud) 我正在尝试计算平滑连接管的双三次贝塞尔曲面的控制点。此示例为相应的贝塞尔曲线图块提供了 16 个控制点(采用 OpenSCAD 的语法):
[[[ 2 , 2 , 0], [2.5, 1.5, 0], [3.5, 1 , 0], [4, 1 , 0]],
[[ 2 , 2 , 1], [2.5, 1.5, 1], [3.5, 1 , 1], [4, 1 , 1]],
[[1.3, 1.3, 2], [1.8, 0 , 2], [ 3 , 0.5, 2], [4, 0.5, 2]],
[[ 0 , 0 , 2], [1.8, 0 , 2], [ 3 , 0 , 2], [4, 0 , 2]]]
Run Code Online (Sandbox Code Playgroud)
给出了角点;沿边缘的控制点(以红色显示)是根据具有明显方向的切线计算的:
该补片可以在平面 z=0、y=0、x=4 和 x=y 上进行镜像,以生成更大的复合曲面,该曲面沿所有四个接缝 …