java修改位深度_【分享】刚刚弄明白如何获取图像文件的位深度,适合任何语言。...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

bmp:

位深度储存在第29和第30个byte里面,不过其实第30个byte肯定是0,所以就看第29个——b[28]就行了。

int bitsPerPixel = (b[28] & 0xff) | (b[29] & 0xff) << 8;

gif:

位深度就在第11个byte里面,就一个,很好找。当然,这是第一张的,如果是该GIF文件是多张图片组成的动态图像,那么位深度则应该是单张位深度最高的那张的位深度。

int bitsPerPixel = (b[10] & 0x07) + 1;

jpg:

JPEG图像文件的高压缩储存方式注定了里面的规则比较复杂,都是一个标记跟着一个长度,

一个标记跟着一个长度。而要找位深度就要先找对标记,找对了标记再往下移几位就是了。

int i = 2;

while (true) {

int marker = (b[i] & 0xff) << 8 | (b[i + 1] & 0xff);

int size = (b[i + 2] & 0xff) << 8 | (b[i + 3] & 0xff);

if (marker >= 0xffc0 && marker <= 0xffcf && marker != 0xffc4 && marker != 0xffc8) {

int bitsPerPixel = (b[i + 4] & 0xff) * (b[i + 9] & 0xff);

break;

} else {

i += size + 2;

}

}

png:

这个就有点奇怪了,因为PNG图像是有4个通道——red、green、blue、alpha的,但是不是所有的PNG图像都有透明区域的,所以有些情况下并不是32位的。

我试过两种情况:1.使用Photoshop新建一张图片,这时候的唯一一张图层是背景图层,然后直接保存为PNG图像文件,而不要把它转换为普通图层,然后你右键文件打开属性,会发现位深度是24位的;2.使用QQ截图,截取的图像直接保存为PNG图像文件,这样你也会发现是24位的。

但是如果你用mspaint(Microsoft Paint,Windows自带的画图软件)打开后,再保存,你会发现位深度变成了32位(当然文件大小也变大了)。

我从代码里得到的方法是这样的

如果第26个byte的数值是2或者6,那么位深度是3倍的第25个byte;若不是,则直接是第25个byte。但是我发现,这样得到的结果始终是24位,而非32位,所以我觉得有两种可能:1.也许这代码错了,作者找错位置了;2.该方法只能找到其中alpha通道除外的其他3个通道的位深度,而是否有alpha通道则要另外找信号确认。

int bitsPerPixel = (b[25] & 0xff) == 2 || (b[25] & 0xff) == 6 ? (b[24] & 0xff) * 3 : b[24] & 0xff;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值