📄 project.c
字号:
// Ex8
// 水平投影与图像颜色反转
#include <windows.h>
#include "image32.h"
extern HDC hMemDC;
extern struct IMAGE *image;
extern struct IMAGE *Image[10];
void ImageCopy(int m,int n); // 图象复制
void Project(HWND hWnd)
{
LOGPEN lpRed = {PS_SOLID,1,1,RGB(255,0,0)},
lpGreen = {PS_SOLID,1,1,RGB(0,255,0)},
lpBlue = {PS_SOLID,1,1,RGB(0,0,255)},
lpBlack = {PS_SOLID,1,1,RGB(0,0,0)};
HPEN lpRedPen,lpGreenPen,lpBluePen,lpBlackPen;
int i,j,k,n,wid,hei,sum;
BYTE buf[4096],buf2[3][2048];
if ((Image[0]->hdib==NULL)||(Image[0]->bitcount<8)) return;
ClearDDB();
WriteDDB(Image[0], 0, 0, 0, 0,512,512);
wid=Image[0]->wid;
hei=Image[0]->hei;
n =Image[0]->bpp;
for (k=0;k<n;k++) { // 水平投影
for (i=0;i<hei;i++) {
getimage(Image[0],0,i,wid,1,buf);
sum=0;
for (j=0;j<wid;j++) {
sum+=buf[j*n+k];
}
buf2[k][i]=sum/wid;
}
}
lpRedPen = CreatePenIndirect(&lpRed);
lpGreenPen = CreatePenIndirect(&lpGreen);
lpBluePen = CreatePenIndirect(&lpBlue);
lpBlackPen = CreatePenIndirect(&lpBlack);
hMemDC=CreateMemDC();
SelectObject(hMemDC,lpBlackPen);
MoveToEx(hMemDC,wid+300,0,NULL);
LineTo(hMemDC,wid+300,hei);
for (k=0;k<n;k++) {
if (n==1)
SelectObject(hMemDC,lpBlackPen);
else {
if (k==0)
SelectObject(hMemDC,lpBluePen);
else if (k==1)
SelectObject(hMemDC,lpGreenPen);
else
SelectObject(hMemDC,lpRedPen);
}
MoveToEx(hMemDC,wid+300-buf2[k][1],1,NULL);
for (i=1;i<hei-1;i++) {
LineTo(hMemDC,wid+300-buf2[k][i],i);
}
}
DeleteMemDC(hMemDC);
ImageCopy(0,1);
if (2*hei<700) { // 图像颜色反转
for (i=0;i<hei;i++) {
getimage(Image[1],0,i,wid,1,buf);
for (j=0;j<wid*n;j++) {
buf[j]=255-buf[j];
}
setimage(Image[1],0,i,wid,1,buf);
}
WriteDDB(Image[1],0,hei+20,0,0,wid,hei);
}
InvalidateRect(hWnd,NULL,FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -