WindowsXP、VC++2005(MFC)です。
別のページから持ってきました↓
void CScrollView::SaveImage(const CRect& rect, int bitdepth, int cx, int cy,
LPCTSTR output) {
const int colors = ((1 << bitdepth) & 0x1ff);
const int headerLen = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * colors;
BITMAPINFO* bi = reinterpret_cast<BITMAPINFO*>(new BYTE[headerLen]);
memset(bi, 0, sizeof(BITMAPINFOHEADER));
bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bi->bmiHeader.biWidth = cx;
bi->bmiHeader.biHeight = cy;
bi->bmiHeader.biPlanes = 1;
bi->bmiHeader.biBitCount = bitdepth;
bi->bmiHeader.biSizeImage = (((bi->bmiHeader.biBitCount *
bi->bmiHeader.biWidth + 31) / 32) * 4) * bi->bmiHeader.biHeight;
// grayscaleパレット構築
for (int i=0; i < colors; ++i) {
bi->bmiColors[i].rgbBlue = bi->bmiColors[i].rgbGreen =
bi->bmiColors[i].rgbRed = ::MulDiv(255, i, (colors - 1));
bi->bmiColors[i].rgbReserved = 0;
}
CDC dc;
dc.Attach(::CreateCompatibleDC(NULL));
void* bits;
CBitmap bitmap;
bitmap.Attach(::CreateDIBSection(NULL, bi, DIB_RGB_COLORS, &bits, NULL,
0));
CBitmap* oldbmp = dc.SelectObject(&bitmap);
dc.FillSolidRect(0, 0, bi->bmiHeader.biWidth, bi->bmiHeader.biHeight,
RGB(0xff, 0xff, 0xff));
dc.SetMapMode(MM_ANISOTROPIC);
dc.SetWindowOrg(0, 0);
dc.SetViewportOrg(::MulDiv(-rect.left, cx, rect.Width()),
(::MulDiv(-rect.top, cy, rect.Height())));
dc.SetWindowExt(rect.Size());
dc.SetViewportExt(cx, cy);
dc.SetStretchBltMode(HALFTONE);
CScrollView::OnDraw(&dc); // イメージ描画処理
dc.SelectObject(oldbmp);
// bmp保存
BITMAPFILEHEADER bfh = { 0 };
bfh.bfType = 0x4d42;
bfh.bfSize = sizeof(BITMAPFILEHEADER) + headerLen + bi-
>bmiHeader.biSizeImage;
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + headerLen;
CFile file(output, CFile::modeCreate | CFile::modeWrite);
file.Write(&bfh, sizeof(BITMAPFILEHEADER));
file.Write(bi, headerLen);
file.Write(bits, bi->bmiHeader.biSizeImage);
delete []reinterpret_cast<BYTE*>(bi);
}
この最後のWriteで、サイズが大きすぎるので、for文などでサイズを限定させて少しず
つファイルへ出力するようにしたいのですが、どのようにしたら良いのでしょうか?
とりあえず、
①bitsのサイズを持っておく
②出力するサイズの定数を持っておく
③bitsの先頭から「②」の定数ずつファイルへ出力し、bitsのポインタを「②」の分進
めておく
といった感じになるのかな?という程度しかわかっておりません・・・。
「それくらい自分で調べろ素人が!」と思われるとは思いますが、
参考になるサイトのURLでも構いませんので、
どうかご教授よろしくお願いいたしますm(__)m
> といった感じになるのかな?という程度しかわかっておりません・・・。
やってみてはいかがです?
分割する必要ない。
なんで分割しないといけないか?
こっちが聞きたい。
やり方のイメージがある程度出来ているのであれば、
実際にコードに落として試してみる。
うまく行かない場合にそのコードを提示して
こう言う現象が起きているのだけれど、
どの辺がおかしいのでしょう?
という感じで聞いた方が良いかと思います。
処理のイメージが全く無いと言うならわかりますが、
イメージは出来ているようですし、
ファイルの出力部分のコードも提示されたコードの中に
ありますから、何処が分からないのかがわかりません。
すいません、質問自体が不要になりましたので解決とさせていただきます。
ご回答いただいた方含め、このページを参照された方本当にすいませんでした。