StretchBlt如何获得源矩形(即想要插入的图片的)宽度及高度,用哪个函数
具体要看你是怎么载入图片的,一般有2种做法:
1是用Windows的API直接读取位图文件,这需要你清楚位图文件的构成。位图文件有3部分构成:
1位图文件头--BITMAPFILEHEADER,
2位图信息头--BITMAPINFOHEAD,
3是位图数据。
你要的东西就在位图信息头里,这里面有着位图详细的信息(位图大小,高和度都在里面),详细见MSDN,读取时用CFile类的Read函数就可以,读取位图文件的3部分后用StretchDIBits把位图写到你指定的用来做源的CDC设备上下文中,以后你调用StretchBlt时就有源矩形的宽度及高度了,这个方法做起来好麻烦的!
2创建一个与显示窗口兼容的DC,是用LoadImage函数载入位图得到一个HBITMAP的句柄,创建一个CBitmap类对象,用对象绑定前面的句柄,设置一个BITMAP变量bm,CMitmap类有个函数GetBitmap可以获得你要的信息(放入了bm中),把CBitmap对象放入到你创建的与显示窗口兼容的DC里,你就可以用StretchBlt函数了,注意源就是你创建的与窗口兼容的DC,这个方法比前面那个稍为简单点。但也麻烦!
最好的方法是用GDI+,建2个对象,一个Graphics对象,一个Imgae对象,你要的宽度和高度信息用Image对象的获取宽度和高度信息的函数就能得到,最主要的是建立Image对象超简单:Image myImage("你的位图文件名");把对象myImage传给Graphics对象,一下就能按你想的缩放来显示图片了!
最后给你一个方法2的代码,你变通下可以用的:
ShowBMP(CDC* pDC)
{
//注意pDC是指你的显示窗口的设备上下文
CDC * pMemDC = new CDC;// 内存显示DC
pMemDC->CreateCompatibleDC(pDC);// 创建与当前DC兼容的DC
// 从位图文件中载入位图数据,并返回位图的句柄
//m_strFileName注意是你的位图文件名
HBITMAP hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), m_strFileName,
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
CBitmap bitmap;// CBitmap类对象
bitmap.Attach(hBitmap);// 绑定位图数据
BITMAP bm;
// 到下面你要的信息已经放入变量bm中了
bitmap.GetBitmap(&bm);
pMemDC->SelectObject(&bitmap); //这是把位图对象放入源DC中去
CRect rect;
GetClientRect(rect); //这里是获取你的显示窗口的客户区
pMemDC->SetStretchBltMode(COLORONCOLOR);
// 绘制位图
pDC->StretchBlt(0,0,rect.x,rect.y,pMemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
//delete pMemDC;
}
代码我没验证,具体应用到你的工程要看你的理解了
vc中StretchBlt怎么实现图片的旋转
StretchBlt实现不了,它只能实现绽放,要用GetPixel()和SetPixel()函数来做,基本法是,你创建一个图片的内存DC,按照你想要旋转的方式来重新写入各个像素的颜色,例如,你把图片的右下角的点的颜色写入到内存图片DC的左上角,再把最石下角左边的那个点写到左上角第二个位置,如此通过循环后,再把图片内存DC 显示出来,就能实现旋转。
不推荐你用GDI来做复杂的图片操作,用GDI+做起来要简单得多!
android怎么实现图片旋转
可以使用RotateAnimation动画实现,设定无限循环即可代码如下public class MyActivity extends Activity {ImageView iv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_two);iv = (ImageView)findViewById(R.id.image);RotateAnimation animation = new RotateAnimation(0, 360);animation.setDuration(100000);//设定转一圈的时间animation.setRepeatCount(Animation.INFINITE);//设定无限循环animation.setRepeatMode(Animation.RESTART);iv.startAnimation(animation);}}也可以自定义view继承于imageview,启动一个线程,在while循环里设置view的旋转角度public class RotateView extends ImageView implements Runnable {private float mCurDegree = 0;//当前旋转角度public RotateView(Context context, AttributeSet attrs) {super(context, attrs);new Thread(this).start();}@Overrideprotected void onLayout(boolean changed, int left, int top, int right,int bottom) {super.onLayout(changed, left, top, right, bottom);//设定旋转中心setPivotX(getMeasuredWidth()/2);setPivotY(getMeasuredHeight()/2);}@Overridepublic void run() {while(true){setRotation(mCurDegree);mCurDegree += 5;postInvalidate();SystemClock.sleep(16);}}}在布局文件里使用RotateView代替imageview即可
如何自定义更改bitmap 或者drawble的宽和高
/**
* @param path 路径
* @param displayWidth 需要显示的宽度
* @param displayHeight 需要显示的高度
* @return Bitmap
*/
public static Bitmap decodeBitmap(String path, int displayWidth, int displayHeight) {
BitmapFactory.Options op = new BitmapFactory.Options();
op.inJustDecodeBounds = true;
// op.inJustDecodeBounds = true;表示我们只读取Bitmap的宽高等信息,不读取像素。
Bitmap bmp = BitmapFactory.decodeFile(path, op); // 获取尺寸信息
// op.outWidth表示的是图像真实的宽度
// op.inSamplySize 表示的是缩小的比例
// op.inSamplySize = 4,表示缩小1/4的宽和高,1/16的像素,android认为设置为2是最快的。
// 获取比例大小
int wRatio = (int) Math.ceil(op.outWidth / (float) displayWidth);
int hRatio = (int) Math.ceil(op.outHeight / (float) displayHeight);
// 如果超出指定大小,则缩小相应的比例
if (wRatio > 1 && hRatio > 1) {
if (wRatio > hRatio) {
// 如果太宽,我们就缩小宽度到需要的大小,注意,高度就会变得更加的小。
op.inSampleSize = wRatio;
} else {
op.inSampleSize = hRatio;
}
}
op.inJustDecodeBounds = false;
bmp = BitmapFactory.decodeFile(path, op);
// 从原Bitmap创建一个给定宽高的Bitmap
return Bitmap.createScaledBitmap(bmp, displayWidth, displayHeight, true);
}
如何自定义更改bitmap 或者drawble的宽和高
Bitmap:Bitmap newBmp = Bitmap.createScaledBitmap(oldBmp, displayWidth, displayHeight, true);Drawable先把Drawable转换成Bitmap:Bitmap Drawable2Bitmap(Drawable drawable){ Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight(),drawable.getOpacity() != PixelFormat.OPAQUE ?Bitmap.Config.ARGB_8888: Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight()); drawable.draw(canvas); return bitmap;}2.用上面压缩bitmap宽高的方法压缩bitmap3.Bitmap转换回DrawableDrawable Bitmap2Drawable(Context context, Bitmap bitmap){ return new BitmapDrawable(context.getResources(), bitmap);}
android开发中,seekBar在拖动时进度会改变,如何让音乐播放进度随之改变?
seekbar.setOnSeekBarChangeListener(new seekbarListener());
//这个监听seekbar变化的,一旦有变,变化到哪progress表示
private class seekbarListener implements OnSeekBarChangeListener{
@Override
public void onProgressChanged(SeekBar seekbar, int progress, boolean fromUser) {
if(fromUser==true){
mediaplay.seekTo(progress);//这里就是音乐播放器播放的位子
}
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {
// TODO Auto-generated method stub
}
@Override
public void onStopTrackingTouch(SeekBar arg0) {
// TODO Auto-generated method stub
}
}
还有就是seekbar的进度条变化用Handler更新,
求助:VC如何实现图片的放大和缩小?
用StretchBlt函数即可实现,参考代码如下:void CImgWnd::OnPaint(){ CPaintDC dc(this); // device context for painting //获得窗口大小 CRect r; GetClientRect(&r); //填充背景 HBRUSH brush = (HBRUSH)::GetStockObject(GRAY_BRUSH); ::FillRect(dc.m_hDC,&r,brush); dc.SetStretchBltMode(HALFTONE); //将位图选进设备场景中 CDC memdc; memdc.CreateCompatibleDC( &dc ); CBitmap* pOldBmp= memdc.SelectObject(&m_bmpImage); //获得位图参数 BITMAP bmp; m_bmpImage.GetBitmap(&bmp); //开始缩放 switch(m_nStrechType) { case STRECH_1_1://1:1 dc.BitBlt(r.left,r.top,r.Width(),r.Height(),&memdc,0,0,SRCCOPY); break; case STRECH_FULL_X://按宽度 dc.StretchBlt(r.left,r.top,r.Width(),bmp.bmHeight,&memdc,0,0, bmp.bmWidth,bmp.bmHeight,SRCCOPY); break; case STRECH_FULL_Y://按高度 dc.StretchBlt(r.left,r.top,bmp.bmWidth,r.Height(),&memdc,0,0, bmp.bmWidth,bmp.bmHeight,SRCCOPY); break; case STRECH_FULL://充满窗口 dc.StretchBlt(r.left,r.top,r.Width(),r.Height(),&memdc,0,0, bmp.bmWidth,bmp.bmHeight,SRCCOPY); break; case STRECH_CENTER://居中显示,大小为窗口的一半 dc.StretchBlt(r.Width()/4,r.Height()/4,r.Width()/2,r.Height()/2,&memdc,0,0, bmp.bmWidth,bmp.bmHeight,SRCCOPY); break; } //还原 memdc.SelectObject(pOldBmp);}
VB如何实现比较两幅图片?
如果两个图像文件是同样格式的,那就不要用传统的方法打开图像、加载图像什么的,因为我试验过,VB对图像的支持是很差的,图像太大或是格式太新,都没法正常加载的,所以,我觉的,如果只是判断两个图像是否一样,并且两个图像文件的格式相同的话,完全可以把两个图像文件当成一般的二进制文件打开,然后一个字节一个字节的对比……
Option Explicit
Private Sub Command1_Click()
Const CD = 1024 '一次进行比较的字节数
Dim i As Long, j As Long, k As Long
Dim A As Long, B As Long, C As Long
Dim Sa(1 To CD) As Byte, Sb(1 To CD) As Byte
Dim Fa As String, Fb As String
Fa = "e:\c.bmp" '要比较的两个文件
Fb = "e:\d.bmp"
C = FileLen(Fa)
If C FileLen(Fb) Then
MsgBox "不一样,文件长度不同", , ""
Exit Sub
End If
A = C \ CD
B = C Mod CD
Open Fa For Binary Access Read As #1
Open Fb For Binary Access Read As #2
For i = 1 To A
For j = 1 To CD
DoEvents
Get #1, , Sa(j)
Get #2, , Sb(j)
If Sa(j) Sb(j) Then
MsgBox "不一样,文件内容不同", , ""
Exit Sub
End If
Next
Next
For j = 1 To B
Get #1, , Sa(j)
Get #2, , Sb(j)
If Sa(j) Sb(j) Then
MsgBox "不一样,文件内容不同", , ""
Exit Sub
End If
Next
Close #1
Close #2
MsgBox "一样", , ""
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Unload Me
End
End Sub
怎样弄MFC对话框背景图片
先在资源里导入你的位图,分配好ID号;
在OnPaint()函数中:
if (IsIconic())
{……}
else
{
//CDialog::OnPaint();把这个注释掉,不调用基类的OnPaint()
CPaintDC dc(this);
CDC memdc;
memdc.CreateCompatibleDC(&dc);//创建兼容DC
CBitmap bkg;
bkg.LoadBitmap(这里写你导入位图的ID号);//载入位图
BITMAP bkginfo;
bkg.GetBitmap(&bkginfo);//获取位图信息
memdc.SelectObject(&bkg);
RECT rect;
GetWindowRect(&rect);//获取对话框信息
dc.StretchBlt(0,0,rect.right-rect.left,rect.bottom-rect.top,&memdc,0,0,bkginfo.bmWidth,bkginfo.bmHeight,SRCCOPY);
}
vb编写图形绕一点旋转
正余弦函数
题目:已知一长轴为len,及另一长轴的端点坐标(x1,y1)和(x2,y2)
画出椭圆。
算法步骤:
1、求a,b: a=len/2 b=sqr((x1-x2)^2+(y1-y2)^2)
2、求旋转角α :求出(y1-y2)/(x1-x2)的反正切值即为α
3、求椭圆中心坐标(x0,y0): x0=(x1+x2)/2 y0=(y1+y2)/2
3、计算椭圆上点的坐标(x,y):
x=acosθ , y=bsinθ ( 0<=θ< 2*π)
4、计算图形绕原点旋转α 弧度后的坐标(xx,yy):
xx=x*cos(-α )+y*sin(-α )
yy=-x*sin(-α )+y*cos(-α )
5、计算椭圆中心从原点平移到(x0,y0)后椭圆上点的坐标(xxx,yyy):
xxx=xx+x0
yyy=yy+y0
6、在坐标(xxx,yyy)处画一各点
7、在( 0<=θ< 2*π)范围内,按一定间隔取值,重复3-7步骤,即得所要求的椭圆。
以下是vb代码,新建一个标准工程,不需做任何参数更改。打开代码窗口把代码粘贴进去,替换原来的所有代码,运行即可看效果。希望对你有用
Option Explicit
Dim X1, Y1, X0, Y0, X2, Y2 As Double
Dim A, B, PI As Double
Dim F As Boolean
Private Sub Form_Load()
PI = 3.14159265358979
F = False
DrawWidth = 2
Width = 10000
Height = 8000
End Sub
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
X1 = X
Y1 = Y
B = 1000
F = True
End Sub
Public Sub tuoYuan()
Dim Jiao As Double
Dim i, m, n, m1, n1 As Double
Cls
X0 = (X1 + X2) / 2
Y0 = (Y1 + Y2) / 2
A = Sqr((X0 - X2) ^ 2 + (Y0 - Y2) ^ 2)
If X1 <> X2 Then
Jiao = Atn((Y1 - Y2) / (X1 - X2))
Else
Jiao = PI / 2
End If
Form1.PSet (X1, Y1), RGB(255, 0, 0)
Form1.PSet (X0, Y0), RGB(255, 0, 0)
Form1.PSet (X2, Y2), RGB(255, 0, 0)
For i = 0 To PI * 2 Step 0.01
m = A * Cos(i)
n = B * Sin(i)
'Form1.PSet (m + X0, n + Y0), RGB(255, 0, 0)
m1 = m * Cos(-Jiao) + n * Sin(-Jiao)
n1 = -m * Sin(-Jiao) + n * Cos(-Jiao)
Form1.PSet (m1 + X0, n1 + Y0), RGB(0, 255, 0)
Next i
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If F = True Then
X2 = X
Y2 = Y
Call tuoYuan
End If
End Sub
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
F = False
X2 = X
Y2 = Y
Call tuoYuan
End Sub