for文を使ったファイル出力

[戻る]
しい 2010/01/04(月) 19:26:53
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のサイズを持っておく
A出力するサイズの定数を持っておく
Bbitsの先頭から「A」の定数ずつファイルへ出力し、bitsのポインタを「A」の分進
めておく

といった感じになるのかな?という程度しかわかっておりません・・・。
「それくらい自分で調べろ素人が!」と思われるとは思いますが、
参考になるサイトのURLでも構いませんので、
どうかご教授よろしくお願いいたしますm(__)m

επιστημη [E-Mail] [HomePage] 2010/01/05(火) 08:47:07
> といった感じになるのかな?という程度しかわかっておりません・・・。

やってみてはいかがです?

2010/01/05(火) 10:02:11
分割する必要ない。
なんで分割しないといけないか?
こっちが聞きたい。

PATIO 2010/01/05(火) 10:02:42
やり方のイメージがある程度出来ているのであれば、
実際にコードに落として試してみる。
うまく行かない場合にそのコードを提示して
こう言う現象が起きているのだけれど、
どの辺がおかしいのでしょう?
という感じで聞いた方が良いかと思います。

処理のイメージが全く無いと言うならわかりますが、
イメージは出来ているようですし、
ファイルの出力部分のコードも提示されたコードの中に
ありますから、何処が分からないのかがわかりません。

しい 2010/01/08(金) 12:00:48
[[解決]]
すいません、質問自体が不要になりましたので解決とさせていただきます。

ご回答いただいた方含め、このページを参照された方本当にすいませんでした。

古いスレッドには追加発言できません。