//----------------------------------------------------------------------------------------
//-----------版权声明:本文为博主Mr.Xo原创文章,未经博主允许不得转载。--------------------
//----------------------------------------------------------------------------------------
#include <iostream>
#include <windows.h>
#include <gdiplus.h>
#include <vector>
#include <atlimage.h>
#pragma comment( lib, "gdiplus.lib" )
using namespace Gdiplus;
using namespace std;
//in_buffer为存储了图片像素的buffer,origionWidth为图片宽,origionHeight为图片高
//out_buffer为计算后的像素存储buffer, splitW为图片分割列值,splitH为图片分割行值
void CalculatePixel( void* in_buffer, int origionWidth, int origionHeight, void* out_buffer, int splitW, int splitH ) //图片像素分割计算函数
{
unsigned int uIn_buffer_arrayIndex = 0;
unsigned char** ppPixelArray = new unsigned char*[ origionHeight ];
for( int i = 0; i < origionHeight; i++ )
{
ppPixelArray[ i ] = new unsigned char[ origionWidth * 4 ];
for( int j = 0; j < origionWidth * 4; j++ )
{
unsigned char b = (unsigned )( (char*)in_buffer )[ uIn_buffer_arrayIndex ];
ppPixelArray[ i ][ j ] = (unsigned )( (char*)in_buffer )[ uIn_buffer_arrayIndex ];
uIn_buffer_arrayIndex++;
}
}
uIn_buffer_arrayIndex = 0;
int iPortionRow = origionHeight / splitH;
int iPortionCol = origionWidth * 4 / splitW;
int iRowStart = 0, iColStart = 0;
int iErgodicFrequency = splitW * splitH;
int iErgodicCount = 0;
int iColStartAddCount = 0;
int iPortionIndex = 0;
while( true )
{
for( int i = iRowStart; i < ( iRowStart + iPortionRow ); i++ )
{
for( int j = iColStart; j < ( iColStart + iPortionCol ); j++ )
{
( (char**)out_buffer ) [ iPortionIndex ][ uIn_buffer_arrayIndex ] = ppPixelArray[ i ][ j ];
uIn_buffer_arrayIndex++;
}
}
uIn_buffer_arrayIndex = 0;
iPortionIndex++;
iColStart += iPortionCol;
iColStartAddCount++;
if( iColStartAddCount == 4 )
{
iColStart = 0;
iColStartAddCount = 0;
iRowStart += iPortionRow;
}
iErgodicCount++;
if( iErgodicCount >= iErgodicFrequency )
{
break;
}
}
for( int i = 0; i < origionHeight; i++ )
{
delete ppPixelArray[i];
}
delete ppPixelArray;
}
void main()
{
GdiplusStartupInput gdiplusStartupInput;
unsigned long gdiplustoken;
GdiplusStartup( &gdiplustoken, &gdiplusStartupInput, NULL ); //初始化windows gdi+,
HBITMAP imgBitmap;
Bitmap imgObj( L"girl.bmp" ); //加载需要分割的图片
int ImageWidth = imgObj.GetWidth(), ImageHeight = imgObj.GetHeight();
imgObj.GetHBITMAP( NULL, &imgBitmap ); //将Bitmap加载对象转换为位图句柄
HDC hdc = GetDC( NULL );
unsigned char* clrBit = new unsigned char[ ImageWidth * ImageHeight * 4 ]; //创建储存图片像素的buffer
GetBitmapBits( imgBitmap, ImageWidth * ImageHeight * 4, clrBit ); //获取位图位像素并拷贝入clrBit
vector< void* >outBuffer; //像素分割计算后需要的buffer
for( int i = 0; i < 100; i++ ) //100这个值可以根据不同需求更改
{
unsigned char* tmp = new unsigned char[ ImageWidth * ImageHeight * 4 ];
memset( tmp, 0, ImageWidth * ImageHeight * 4 );
outBuffer.push_back( tmp );
}
int iSplitW = 4, iSplitH = 4; //iSplitW为要分割的列值,iSplitH为要分割的行值
CalculatePixel( clrBit, ImageWidth, ImageHeight, &outBuffer[0], iSplitW, iSplitH ); //像素分割计算
int iPixelIndex= 0;
int iCpyCount = 0;
int ImageNameIndex = 0;
while( true )
{
CImage imageObj;
imageObj.Create( ImageWidth / iSplitW, ImageHeight / iSplitH, 32 ); //创建32位空图片对象
for( int i = 0; i < ImageWidth / iSplitW * ImageHeight / iSplitH; i++ )
{
unsigned char a = (unsigned)( (char*)outBuffer.at( iPixelIndex ) )[ i * 4 + 3 ]; //像素alpha值,这里可不列入计算
unsigned char r = (unsigned)( (char*)outBuffer.at( iPixelIndex ) )[ i * 4 + 2 ]; //像素R值
unsigned char g = (unsigned)( (char*)outBuffer.at( iPixelIndex ) )[ i * 4 + 1 ]; //像素G值
unsigned char b = (unsigned)( (char*)outBuffer.at( iPixelIndex ) )[ i * 4 + 0 ]; //像素B值
COLORREF clrPixel = RGB( r, g, b );
imageObj.SetPixel( i % ( ImageWidth / iSplitW ), i / ( ImageWidth / iSplitW ), clrPixel ); //设置像素
}
iPixelIndex++;
wchar_t szFilePath[ 255 ];
wsprintf( szFilePath, L"IMG_%d.jpg", ImageNameIndex ); //生成分割后的图片名
ImageNameIndex++;
imageObj.Save( szFilePath ); //保存图片
iCpyCount++;
if( iCpyCount >= iSplitW * iSplitH )
{
break;
}
}
system( "pause" );
}