C#bitmap放大图片的效果(指像素位置,而不是是否清晰的效果)和第三方库不同怎么办?
测试图是一张666×376的png,要放大到1920×1080 (其实原图就是1920×1080的,这个666×376的就是通过原图缩小作为放大测试用的)结果我用bitmap的构造函数
Bitmap(Image, Size)从指定的现有图像(缩放到指定大小)初始化 Bitmap 类的新实例。
去得到放大为1920×1080的图片。然后分别还用了 ImageSharp、SkiaSharp、ImageMagic 3个最出名的C#的图片库进行同样放大
结果发现,这几个第三方库做出来的效果一样(都是和1920×1080的原图完丝合缝,当然图片中细节肯定是有所模糊,但图片中明显的轮库等完全对得上)
只有bitmap直接通过构造函数操作的,最终得到的图片和其他三个第三方,和原图是对不上的,向左上角明显偏移了,好像还不止1像素,得有2像素,用看图软件鼠标滚轴切换2图,实在是明显
这怎么办呢?算是bug吧?毕竟其他第三方库的结果和原图都是完全吻合的,只是bitmap自己的方法出问题(另外用Graphics.DrawImage得到的完全一样,也对不上) 有没有一种可能,你说的bug是放大算法的问题,无论是drawimage还是bitmap构造函数,最后用的是同一套底层放大算法。。。而且bitmap我记得是仅限Windows平台支持,应该是底层库的事,你看看系统自带的画图是不是也是这种情况 666 / 376= 1.77127659574468
1920/1080 = 1.7777777777777
从这个角度考虑,不做特殊处理的话对不上应该是正常的。 MIAIONE 发表于 2023-1-24 18:13
有没有一种可能,你说的bug是放大算法的问题,无论是drawimage还是bitmap构造函数,最后用的是同一套底层放 ...
应该就是算法吧。和其他的不一样。但谁正确显而易见(毕竟是用本来就1920×1080的缩到这个尺寸,然后用不同的库进行放大)
但官方库的方法,出现这种bug,很无语,不知道该怎么办 only998 发表于 2023-1-24 18:43
666 / 376= 1.77127659574468
1920/1080 = 1.7777777777777
从这个角度考虑,不做特殊处理的话对不上应 ...
从另外角度看,毕竟是用本来就1920×1080的缩到这个尺寸,然后用不同的库进行放大
只有官方库的方法,出现这种bug。其他第三方库都能保证,将缩小后的图重新放大,可以和原来吻合
本帖最后由 ilovecomputer66 于 2023-1-24 23:32 编辑
only998 发表于 2023-1-24 18:43
666 / 376= 1.77127659574468
1920/1080 = 1.7777777777777
从这个角度考虑,不做特殊处理的话对不上应 ...
补充。bitmap的构造函数进行缩放。是所有我测过的5个图片库中,唯一一个将原图,用它缩小,然后再次放大回原图,发现图片位置对不上的 (bitmap先缩小这一步得到的图,和其他所有库完全相同。只是放大有问题)
所以,我不觉得它错的很有道理。 ilovecomputer66 发表于 2023-1-24 22:58
补充。bitmap的构造函数进行缩放。是所有我测过的5个图片库中,唯一一个将原图,用它缩小,然后再次放 ...
常见的算法就3种: 近邻插值、双线性插值、双立方插值,我严重怀疑bitmap用的是其他插值,然而主流编辑软件等用的基本默认都是近邻插值,建议看看bitmap的构造函数实现,.net7版本可以看到源代码,右键转到定义看看有木有具体实现,没有的话建议看看runtime里是怎么写的,但是根据你上面说的gdiplus也有这个问题,在怀疑是gdiplus底层的问题,建议用非托管的gdi直接试试贴图,如果还对不上就别用bitmap了,毕竟imagesharp还是挺好用的,非要用bitmap再转过去不就好了,而且bitmapWindows独占,看着CS那个提示强迫症就犯了{:1_908:} MIAIONE 发表于 2023-1-25 02:22
常见的算法就3种: 近邻插值、双线性插值、双立方插值,我严重怀疑bitmap用的是其他插值,然而主流编辑软 ...
并不是的。换Graphics.DrawImage来实现,效果一样
而.InterpolationMode中提供的几个,就是兄弟说的几个常见的差值算法。换了一遍试。结果都一样 MIAIONE 发表于 2023-1-25 02:22
常见的算法就3种: 近邻插值、双线性插值、双立方插值,我严重怀疑bitmap用的是其他插值,然而主流编辑软 ...
想用bitmap是因为,再处理图像时,imageSharp就算用span,效率比bitmap用unsafe直接操作array,一张1080p的图,差不多bitmap快3倍。
如果没有办法解决这个放大问题,再中间换其他库,等于上面获得的效率就白费了
虽然bitmap不能跨平台,但本来这个客户端程序就是客户只需要运行在不同windows系统下的(win10、win7) 本帖最后由 ilovecomputer66 于 2023-1-25 09:33 编辑
only998 发表于 2023-1-24 18:43
666 / 376= 1.77127659574468
1920/1080 = 1.7777777777777
从这个角度考虑,不做特殊处理的话对不上应 ...
我确定了。和这个绝对没有任何关系
即便把1920×1080,先缩小到480×270 (正好都是除以4),然后再放大回1920 1080
bitmap仍旧是错的,其他库都对的
页:
[1]
2