HBITMAP数据对齐

CreateDIBSection生成HBITMAP时,传入的第四个参数ppvBits即会返回指向HBITMAP图像数据的指针,访问数据里面的点会涉及到数据对齐的问题。

一般我们访问未数据对齐的点的方法是:

1
2
3
4
5
6
7
8
for (int i = 0; i < width; i++)
{
	for (int j = 0; j < height; j++)
	{
		BYTE *color3 = pvBits + (j * width + i) * 3;
		...
	}
}

但HBITMAP的数据有对齐规定,正确访问方法是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
BITMAP bm;
CBitmap cbm;
cbm.Attach(hBmp); // <- 这是HBITMAP
cbm.GetBitmap(&bm);
int pixelBytes = bm.bmBitsPixel / 8;
for (int i = 0; i < width; i++)
{
	for (int j = 0; j < height; j++)
	{
		//pData在此没给出获取方法,网上都是关联HDC来获取,不爽,
		//具体是用GetDIBits函数从HBITMAP里拷贝一份内存出来
		BYTE *color3 = pData + j * bm.bmWidthBytes + i * pixelBytes;
		DWORD byte0 = *color3;
		DWORD byte1 = *(color3 + 1);
		DWORD byte2 = *(color3 + 2);
		COLORREF color4 = (byte0 << 16) | (byte1 << 8) | byte2;
		::SetPixel(hDC, i, height - j, color4);
	}
}

vs调试时path环境

在项目的属性,debugging,environment设置想要的path:

Path=new_path;$(Path)

注意,<new_path>不能用双引号括起来,Path变量名大小写都可以。

pyplot imshow 没有窗口

在调用完imshow之后,要继续调用show方法才能显示出来。

例如:

1
2
3
4
5
6
from PIL import Image
import matplotlib.pyplot as plt
 
image = Image.open("smallpi.jpg")
plt.imshow(image) # 绘制图像image
plt.show() # 需要调用show()方法,不然图像只会在内存中而不显示出来
1
2
import pdb
pdb.set_trace()

curl_easy_perform response返回码

curl_easy_perform返回值只表明此函数执行的情况,若要得到http response,必须在执行curl_easy_perform之后调用curl_easy_getinfo获取,例如:

1
2
3
4
long retcode = 0;
int ret = curl_easy_getinfo(_curlHandle, CURLINFO_RESPONSE_CODE , &retcode);
if ((CURLE_OK == ret) && retcode)
cout<<"response: "<<retcode<<endl;

Source Insight Memo

Options -> Preferences -> Display -> Trim long path names with ellipses

Options -> File Type Options -> Auto Indenting -> Auto Indent Type

ddraw非法内存访问

必须在IDirectDrawSurface_Lock后引用DDSURFACEDESC2结构体的lpSurface成员才有效,否则非法内存访问,lpSurface不会是一直不变的,且不会在初始化调用IDirectDraw7_CreateSurface时被赋值。

StretchDIBits裂纹失真

在调用StretchDIBits之前,调一下下面这一句就不会出裂纹了。

SetStretchBltMode(hDC, COLORONCOLOR);

还有换成下面这一句,平滑效果更好些:

SetStretchBltMode(hDC, STRETCH_HALFTONE);