VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1102|回复: 7

如何切割一张PNG图片

[复制链接]

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-3-1 17:30:01 | 显示全部楼层 |阅读模式
现在有一张PNG图片,需要切割成等大小的几张PNG,请问有什么好的办法?
回复

使用道具 举报

0

主题

55

帖子

32.00

积分

新手上路

Rank: 1

积分
32.00
发表于 2020-5-17 16:30:01 | 显示全部楼层
将PNG图像的内存数据,按行列分成若干相等的内存块。
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-6-10 10:15:01 | 显示全部楼层
问题是我并不清楚内存数据分布是怎么样的,怎么保证保存的内存块就是连续的方阵呢?
除非有一个数组记录PNG在内存中的像素排布,这样通过记录png[][]就可以得到相应的区块像素用来保存,并且还要涉及到PNG的压缩算法。
回复

使用道具 举报

0

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-6-25 17:00:01 | 显示全部楼层
将它转换成BMP的数据,再分块,然后转回来就可以了吧

BMP的数据是怎样的你应该清楚撒
回复

使用道具 举报

0

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-6-30 10:00:01 | 显示全部楼层
png和bmp差不多,头上一大段都是图片各种信息,后面的是每个pixel的颜色数据(256色的用调色板,24位的用ARGB),可以用GDI+搞定

bitmap = new Bitmap(L"sample.png");
pixelFormat = bitmap->GetPixelFormat(); //如 PixelFormat24bppRGB,PixelFormat8bppIndexed
width = bitmap->GetWidth();
height = bitmap->GetHeight();

rect.X = 0;
rect.Y = 0;
rect.Width = width;
rect.Height = height;
bitmap->LockBits(rect, ImageLockModeWrite, pixelFormat, bitmapData); //把图片读到bitmapData中,然后就可以操作了

p = (byte *) bitmapData->Scan0; //bitmapData->Scan0为图片的第一个象素

有上面的就可以处理了
回复

使用道具 举报

0

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-6-30 12:45:01 | 显示全部楼层
用GetPixel也可以 就是慢很多
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-20 20:30:01 | 显示全部楼层
哪位大虾介绍的再详细一点呀?
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-8-4 12:15:01 | 显示全部楼层
我最后用CImage类来处理了,比较方便
不过还是非常感谢micjoy提供的算法~我用FMC做完当前项目就考虑micjoy的算法自己写一个!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表