拼接并保存图片

YECH 2006-08-22 03:08:52
一共100个图片,是一个大图片分割成10*10块,每块大小一样,现在想把这些图片再组成原来的大图片并保存下来。
用picuturebox 的savepicture方法要求 picturebox的autoredraw为true,否则说can't create autoredraw image ,但是auturedraw=true时如何把图片顺序放到picturebox里呢?paintpicture或者bitblt都不行 也报can't create autoredraw image,请问如何解决?现在看来要想存图片就不能拼接,要想拼接就不能存图片,用form自己的picture倒是可以,但是最大1024*768,图片远大于这个尺寸。
...全文
398 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
熊孩子开学喽 2006-08-22
  • 打赏
  • 举报
回复
超过PICTURE控件的尺寸的话,就要用BMP文件格式来直接写文件了。
其实就是一堆定义,关于BMP文件头的定义,这些都是可以直接套用的。
但是这样的话,就不能再用贴图方式来拼接了,而是要用到数据拼接了。

举个形象点的例子:

图片A的内容:
2 2 2
3 3 3
4 4 4

图片B的内容
3 3 3
4 4 4
2 2 2

上下拼:
2 2 2
3 3 3
4 4 4
3 3 3
4 4 4
2 2 2

水平拼:
2 2 2 3 3 3
3 3 3 4 4 4
4 4 4 2 2 2



在BMP文件中数据是按照先行后列方式存放的,要是你的两个图片是上下拼接还好点
如果是水平方向拼接的话,你想想看这个数组怎么合并?
不是不能解决,而是有点难度的。排错位置的话,不好意思,您的图片就是个废品了。
熊孩子开学喽 2006-08-22
  • 打赏
  • 举报
回复
auturedraw=true时如何把图片顺序放到picturebox里呢?

-----------------------
当auturedraw=true时和一般的时候一样贴图片的,BITBLT也好,PAINTPICTURE也好,只是在贴完之后用PICTURE1.REFRESH来刷新一下就可以看到结果了。
benyfeifei 2006-08-22
  • 打赏
  • 举报
回复
太大了,超出范围了。
如果你的图片是BMP的话,可以直接操作BMP文件。
你可以去网上去找找关于BMP文件格式的资料看看。
YECH 2006-08-22
  • 打赏
  • 举报
回复
我发现开始不把picturebox width height设置成5000*4000就不报错,但是存出来的图片尺寸就不对了
YECH 2006-08-22
  • 打赏
  • 举报
回复
5000*4000多pixel
benyfeifei 2006-08-22
  • 打赏
  • 举报
回复
你的图片有多大啊??!!
YECH 2006-08-22
  • 打赏
  • 举报
回复
有什么api可以直接存图片吗?用picturebox实在头大了
YECH 2006-08-22
  • 打赏
  • 举报
回复
picturebox autoredraw设置为true后bitblt就报错了 can't create autoredraw image
benyfeifei 2006-08-22
  • 打赏
  • 举报
回复
多贴了一点东西,BITMAP不需要。
benyfeifei 2006-08-22
  • 打赏
  • 举报
回复
把picturebox的autoredraw属性设置成true

Dim hPicture As Picture
Dim hMemDC As Long
Dim bm As BITMAP


for 100次
Set hPicture = LoadPicture(App.Path + "\" & i & ".bmp")

hMemDC = CreateCompatibleDC(GetDC(hPicture.Handle))

SelectObject hMemDC, hPicture.Handle

BitBlt Picture1.hdc, i, 0, hPicture.Width, hPicture.Height, hMemDC, 0, 0, vbSrcCopy '坐标自己算吧

DeleteObject hPicture.Handle

DeleteDC hMemDC
next

Picture1.Refresh

SavePicture Picture1.Image, App.Path + "\2.bmp"


Set hPicture = Nothing

api声明如下:
Public Type BITMAP
bmType As Long
bmWidth As Long
bmHeight As Long
bmWidthBytes As Long
bmPlanes As Integer
bmBitsPixel As Integer
bmBits As Long
End Type
Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Public Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal hSrcDC As Long, _
ByVal xSrc As Long, _
ByVal ySrc As Long, _
ByVal dwRop As Long) As Long


Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, _
ByVal hObject As Long) As Long

Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long



Public Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
YECH 2006-08-22
  • 打赏
  • 举报
回复
能不能具体点?
pigsanddogs 2006-08-22
  • 打赏
  • 举报
回复
多放几个picture不就行了

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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