google上下像素点怎么这么大,小弟在线狂等

孤狼仔 2013-07-22 07:59:09
我从google上下200*200的图片,一张不过27kb,我下1*1的像素点,就有98b,如果以这样的算,一张图片200*200就要4w个字节,差不多就是4M,怎么有怎么大的差别。我不要一张图片4M,但是我想下1*1像素,有没有什么办法,我下的都是png格式,是不是跟png格式有关?小弟在线狂等呀?大神帮忙,小弟学的是用java操作?
...全文
595 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2013-08-20
  • 打赏
  • 举报
回复
楼主,我要崩溃了。 后面的对话,我基本都没看了。 楼主,你要明白,RGB像素点,在内存中,应该是一个 像素点由三个字节的数字来表示的。 如果把这个像素点,保存成文件的话,理论上说,只需要3bit大小的文件就可以了,但是,实际当中,一个图形文件中,除了要保存图片像素的本身信息外,还要保存其他的信息,比如:文件类型,版本号,是否压缩,压缩算法,数据区的偏移量等等信息。 楼主不应该把一个像素点的文件大小,机械的理解成所占内存的大小,因为,图形文件在加载到内存的过程中会有一个转换过程。 比如,一个像素的PNG图片,在内存中很可能占3个字节(RGB),但保存成图片可能占90+字节; 200X200像素的PNG图片,在内存中很可能占3X200X200=12W个字节=120KB,但保存成图片可能才30+K。 楼主不能偷换这样的概念。 最后,讲讲楼主要达到的目的。 楼主其实是想将4W个单像素点的图片,拼接成一个200X200的图片。 首先,要明确的一点是,这个方法效率相当的低下。 其次,在不考虑效率的前提下,楼主可以逐次加载这4W的单像素的文件到内存中, 注意,是逐次,不是一次性的全加载。 每加载一个图片到内存后,将单像素点的RGB(3字节)保存下来。 怎么保存? 楼主可以先创建一个200X200的BufferedImage对象,然后,设置对应位置的像素点信息。 当像素点信息保存下来后,卸载已加载的图片(或交给垃圾回收机制)。 之后,重复上述过程,逐次加载、保存、卸载,直到4W个像素点都保存下来。 最后,将BufferedImage对象,以PNG格式输出到硬盘文件中,即可。
孤狼仔 2013-08-20
  • 打赏
  • 举报
回复
引用 36 楼 owen1759 的回复:
我怀疑你是把老师的意思理解错了,你们老师说了必须要用数据库来保存像素点的颜色么? 有可能你们老师的本意是让你学习图像处理的技术,而不是数据库 你可以用字节数组保存图像的颜色信息,然后用流从数组中获取数据 或者也有可能是让你研究下jpg的格式,因为jpg有种交错存储格式,它就是像你们老师那样实现的,把每隔几个像素点取一个像素点存到文件前段,然后间隔更小的(这样数据就更多)存储到后面,最后面存储的是最完整的数据。这样在网络速度或者GPU速度不足的时候,就会先模糊(因为取到前段数据),再清晰。你在使用数码相机的时候应该有感觉,刚打开图片的时候是模糊的,后来清晰,实际上就是因为jpg格式。
大牛,你给了我一个前进的想法,我对图片处理技术一点都不懂,有什么资料吗?我就是个菜鸟呀,谢谢了。
孤狼仔 2013-08-20
  • 打赏
  • 举报
回复
引用 38 楼 preferme 的回复:
楼主,我要崩溃了。 后面的对话,我基本都没看了。 楼主,你要明白,RGB像素点,在内存中,应该是一个 像素点由三个字节的数字来表示的。 如果把这个像素点,保存成文件的话,理论上说,只需要3bit大小的文件就可以了,但是,实际当中,一个图形文件中,除了要保存图片像素的本身信息外,还要保存其他的信息,比如:文件类型,版本号,是否压缩,压缩算法,数据区的偏移量等等信息。 楼主不应该把一个像素点的文件大小,机械的理解成所占内存的大小,因为,图形文件在加载到内存的过程中会有一个转换过程。 比如,一个像素的PNG图片,在内存中很可能占3个字节(RGB),但保存成图片可能占90+字节; 200X200像素的PNG图片,在内存中很可能占3X200X200=12W个字节=120KB,但保存成图片可能才30+K。 楼主不能偷换这样的概念。 最后,讲讲楼主要达到的目的。 楼主其实是想将4W个单像素点的图片,拼接成一个200X200的图片。 首先,要明确的一点是,这个方法效率相当的低下。 其次,在不考虑效率的前提下,楼主可以逐次加载这4W的单像素的文件到内存中, 注意,是逐次,不是一次性的全加载。 每加载一个图片到内存后,将单像素点的RGB(3字节)保存下来。 怎么保存? 楼主可以先创建一个200X200的BufferedImage对象,然后,设置对应位置的像素点信息。 当像素点信息保存下来后,卸载已加载的图片(或交给垃圾回收机制)。 之后,重复上述过程,逐次加载、保存、卸载,直到4W个像素点都保存下来。 最后,将BufferedImage对象,以PNG格式输出到硬盘文件中,即可。
google eath 也是这样做的吗,他也是在客户端以文件的格式存放图片的吗?
owen1759 2013-08-09
  • 打赏
  • 举报
回复
我怀疑你是把老师的意思理解错了,你们老师说了必须要用数据库来保存像素点的颜色么? 有可能你们老师的本意是让你学习图像处理的技术,而不是数据库 你可以用字节数组保存图像的颜色信息,然后用流从数组中获取数据 或者也有可能是让你研究下jpg的格式,因为jpg有种交错存储格式,它就是像你们老师那样实现的,把每隔几个像素点取一个像素点存到文件前段,然后间隔更小的(这样数据就更多)存储到后面,最后面存储的是最完整的数据。这样在网络速度或者GPU速度不足的时候,就会先模糊(因为取到前段数据),再清晰。你在使用数码相机的时候应该有感觉,刚打开图片的时候是模糊的,后来清晰,实际上就是因为jpg格式。
孤狼仔 2013-08-01
  • 打赏
  • 举报
回复
引用 27 楼 liyi4337222 的回复:
老师是这样叫我们做的,不然我也不会去google服务器1*1的抓下来,我直接抓200*200的就是了,他讲显示的时候,先加载一部分,也就是隔几个像素加载,达到渐变模糊的效果,就算是隔几个地图加载也要好长时间,有没有很快的从数据库里检索40w条记录的方法呀?
你们老师吃的好饱。。。搞不好都有点撑了。。。暂且认为是故意考验你们技术吧。。。 40W记录,读取磁盘都要花时间,所以再快也快不到哪去。。。 然后在 X 和 Y 上建立索引,以便快速检索某行或某列的点出来。[/quote] 快都快不到哪去呀,我知道这种做法,x,y标示这个像素点的坐标,,建了索引也慢哎呀。 理解么?数据库中直接存储点的颜色,不要存储图片本身!
MiceRice 2013-07-30
  • 打赏
  • 举报
回复
引用 27 楼 liyi4337222 的回复:
老师是这样叫我们做的,不然我也不会去google服务器1*1的抓下来,我直接抓200*200的就是了,他讲显示的时候,先加载一部分,也就是隔几个像素加载,达到渐变模糊的效果,就算是隔几个地图加载也要好长时间,有没有很快的从数据库里检索40w条记录的方法呀?
你们老师吃的好饱。。。搞不好都有点撑了。。。暂且认为是故意考验你们技术吧。。。 40W记录,读取磁盘都要花时间,所以再快也快不到哪去。。。 好吧,回归正题: 这种情况下,你的数据表要另外设计,不能按你之前说法设计,关键字段要这样来: int X, int Y, int RGB 理解么?数据库中直接存储点的颜色,不要存储图片本身! 然后在 X 和 Y 上建立索引,以便快速检索某行或某列的点出来。
孤狼仔 2013-07-25
  • 打赏
  • 举报
回复
引用 32 楼 zqfddqr 的回复:
实验的时候用的是access 数据量很小,然后换的mssql 不过最后这个东西没应用。。。 现在想想这个做法好像不太合适。。。
zqfddqr 2013-07-24
  • 打赏
  • 举报
回复
另外你说的先显示模糊的在现实清晰的好像不是通过这个方式来实现的 好像和jpg的一种格式有关.
zqfddqr 2013-07-24
  • 打赏
  • 举报
回复
引用 楼主 liyi4337222 的回复:
我从google上下200*200的图片,一张不过27kb,我下1*1的像素点,就有98b,如果以这样的算,一张图片200*200就要4w个字节,差不多就是4M,怎么有怎么大的差别。我不要一张图片4M,但是我想下1*1像素,有没有什么办法,我下的都是png格式,是不是跟png格式有关?小弟在线狂等呀?大神帮忙,小弟学的是用java操作?
晕 png 就是压缩格式 的 是一种无损的压缩格式 压弯的大小很小的 .具体是利用了一个调色板什么的 你要研究图像处理这个是必须看的. 一个没有经过压缩的图片可以存储成bmp格式的 这个你直接存储一个就会知道确实是很大的.所以一般图片都会压缩 ,你说的吧图片弄到数据库里通过像素查询的东西 我以前写过一个.数据量小的话还是可以应付的 大的需要进行优化. 40w左右的记录应该没什么问题 看你用什么数据库了.
孤狼仔 2013-07-24
  • 打赏
  • 举报
回复
引用 26 楼 crabisacoolboy 的回复:
这是因为图片文件除了像素点的信息之外,还有文件头信息和调色板信息等,所以并不能按照你的这种方式计算。
你的意思是我的40000个像素点绘成的图片没有4M多,是不是呀?大神![/quote] 当然了,40000个像素点的图片怎么可能有4M多啊,就算是24位的无压缩的位图也只有100多K而已啊。[/quote] 200*200/1024*3=118就是大概118k左右,哪里会有4M多那么大[/quote] 呵呵
孤狼仔 2013-07-24
  • 打赏
  • 举报
回复
引用 23 楼 liyi4337222 的回复:
1张图片40000条记录,我界面上要显示10图片,也就是一下子检索40w的记录,这个也太多了吧,很慢的很慢的!
这种合并应该是事前做吧,合并后的图片存起来,要显示的时候直接显示合并后的才对吧? 如果每次都按点来显示图片,这不是折腾电脑么?这种系统需求也太诡异了吧?[/quote] 老师是这样叫我们做的,不然我也不会去google服务器1*1的抓下来,我直接抓200*200的就是了,他讲显示的时候,先加载一部分,也就是隔几个像素加载,达到渐变模糊的效果,就算是隔几个地图加载也要好长时间,有没有很快的从数据库里检索40w条记录的方法呀?
螃蟹变异了 2013-07-24
  • 打赏
  • 举报
回复
引用 7 楼 rumlee 的回复:
[quote=引用 5 楼 liyi4337222 的回复:] [quote=引用 2 楼 rumlee 的回复:] 这是因为图片文件除了像素点的信息之外,还有文件头信息和调色板信息等,所以并不能按照你的这种方式计算。
你的意思是我的40000个像素点绘成的图片没有4M多,是不是呀?大神![/quote] 当然了,40000个像素点的图片怎么可能有4M多啊,就算是24位的无压缩的位图也只有100多K而已啊。[/quote] 200*200/1024*3=118就是大概118k左右,哪里会有4M多那么大
MiceRice 2013-07-24
  • 打赏
  • 举报
回复
引用 23 楼 liyi4337222 的回复:
1张图片40000条记录,我界面上要显示10图片,也就是一下子检索40w的记录,这个也太多了吧,很慢的很慢的!
这种合并应该是事前做吧,合并后的图片存起来,要显示的时候直接显示合并后的才对吧? 如果每次都按点来显示图片,这不是折腾电脑么?这种系统需求也太诡异了吧?
朗晴 2013-07-24
  • 打赏
  • 举报
回复
来观看各位观点。
zqfddqr 2013-07-24
  • 打赏
  • 举报
回复
实验的时候用的是access 数据量很小,然后换的mssql 不过最后这个东西没应用。。。 现在想想这个做法好像不太合适。。。
孤狼仔 2013-07-24
  • 打赏
  • 举报
回复
引用 22 楼 ldh911 的回复:
1、就是用你之前说的创建图片,然后依次合并像素点; 2、批量查询就是一次性选取多个点出来呗,然后对ResultSet循环处理即可。
1张图片40000条记录,我界面上要显示10图片,也就是一下子检索40w的记录,这个也太多了吧,很慢的很慢的!
孤狼仔 2013-07-24
  • 打赏
  • 举报
回复
引用 29 楼 zqfddqr 的回复:
[quote=引用 楼主 liyi4337222 的回复:] 我从google上下200*200的图片,一张不过27kb,我下1*1的像素点,就有98b,如果以这样的算,一张图片200*200就要4w个字节,差不多就是4M,怎么有怎么大的差别。我不要一张图片4M,但是我想下1*1像素,有没有什么办法,我下的都是png格式,是不是跟png格式有关?小弟在线狂等呀?大神帮忙,小弟学的是用java操作?
晕 png 就是压缩格式 的 是一种无损的压缩格式 压弯的大小很小的 .具体是利用了一个调色板什么的 你要研究图像处理这个是必须看的. 一个没有经过压缩的图片可以存储成bmp格式的 这个你直接存储一个就会知道确实是很大的.所以一般图片都会压缩 ,你说的吧图片弄到数据库里通过像素查询的东西 我以前写过一个.数据量小的话还是可以应付的 大的需要进行优化. 40w左右的记录应该没什么问题 看你用什么数据库了.[/quote] 我用的是mysql,你用的是什么呀?
「已注销」 2013-07-23
  • 打赏
  • 举报
回复
会不会和这方面有影响,一个图片的类似格式如下 头信息【像素点+像素点+像素点....合并信息】尾信息 = 你当前图片大小 你点击了一个像素点,类似格式为 头信息【像素点】尾信息 = 一个像素点大小 如果按照你的计算方式,应该是 头信息【像素点】尾信息 * 像素点个数 不等于 头信息【像素点+像素点+像素点....合并信息】尾信息 多算了很多的头信息和尾信息
孤狼仔 2013-07-23
  • 打赏
  • 举报
回复
引用 15 楼 ldh911 的回复:
粗略估算:1000×1000×4 = 4,000,000 Byte,也即这样的图片在内存中需要占用大约4MB的空间,注意到图片在内存中是处于非压缩状态的,这样才能便于进行显示和处理。当然实际上还会再浪费更多的空间去辅助存储其它信息,但我们大致已经能得到数量级层面的内存开销了。 所以,不会报错。 可以用你的方法来提取每个像素点的RGB值,然后进行图片合并。合并完的图片是 1MB 的像素点,压缩png后存储成文件也许就1MB~3MB,如果用jpg则可能就几百K。
1.一个像素98个字节 1000*1000*98=98,000,000,整么大的内存,也不报错吗?我的像素时以二进制字节存的,有什么方法把4w个字节流合成一张图片? 2.我试了下从数据库里检索4w条记录,吧一个像素的读到1*1的bufferedImage,在提取他的rgb,再new一个1000*1000的bufferedIMage,用rgb在上面合成图片。very ,very慢,不是一般的慢,我该什么办呀,数据库检索真的慢,我打算这次用cluster了,看看什么情况?你有什么好建议吗?micerice!
MiceRice 2013-07-23
  • 打赏
  • 举报
回复
引用 21 楼 liyi4337222 的回复:
1.我赞同用所有二进制文件下手合成是不成功的,那我该如何操作这些二进制才能达到我的目的。 2.我是一次查一个点,我不太懂批量的查询,我只知道批量的插入,我上网查查!
1、就是用你之前说的创建图片,然后依次合并像素点; 2、批量查询就是一次性选取多个点出来呗,然后对ResultSet循环处理即可。
加载更多回复(19)

62,610

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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