また株予測はじめました
いろいろ作ってます。とりあえずまたシミュレーションで実験しているところです。うまくいきそうなら口座開いて実際にやってみます。
GDI+を用いたjpeg保存
C#とかならすごく簡単なのだがC++の場合はwindowsAPIには存在しないのでGDI+を使うのが普通みたいだ。調べたらいろいろ引っかかったのだがメモリ上のRGBからの保存方法が見つからなかったので頑張って書いてみました。
方法としては、GDI+にあるBitmapクラスを使い、まずは空のbitmapを生成してそこにピクセルの値を埋めていくととりあえずできることがわかった。
参考にしたページ。主にgoogleで上位に引っかかったページです(^^;
http://d.hatena.ne.jp/s0u/20080211/1202679717
http://relog.xii.jp/mt5r/2007/06/jpgtiffbmp.html
http://msdn.microsoft.com/en-us/library/ms533843.aspx
以下ソース
#include <Windows.h> #include <GdiPlus.h> #include <Gdiplusinit.h> #pragma comment( lib, "gdiplus.lib" ) int GetEncoderClsid(const WCHAR* format, CLSID* pClsid); bool SaveAsJpegImage( const WCHAR* filename, const unsigned char* aRGBImage, int iSizeX, int iSizeY ) { //GDI+の初期化 Gdiplus::GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); { //bitmapの作成 Gdiplus::Bitmap bmp( iSizeX, iSizeY ); //データを転送 const unsigned char* pPix = aRGBImage; for( int iY = 0; iY < iSizeY; ++iY ){ for( int iX = 0; iX < iSizeX; ++iX ){ Gdiplus::Color color( pPix[0], pPix[1], pPix[2] ); bmp.SetPixel( iX, iY, color ); pPix += 3; } } //jpegとしてセーブ CLSID id; GetEncoderClsid( L"image/jpeg", &id ); bmp.Save( filename, &id ); } //GDI+の開放 Gdiplus::GdiplusShutdown(gdiplusToken); return false; } int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) { UINT num = 0; // number of image encoders UINT size = 0; // size of the image encoder array in bytes Gdiplus::ImageCodecInfo* pImageCodecInfo = NULL; Gdiplus::GetImageEncodersSize(&num, &size); if(size == 0) return -1; // Failure pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size)); if(pImageCodecInfo == NULL) return -1; // Failure GetImageEncoders(num, size, pImageCodecInfo); for(UINT j = 0; j < num; ++j) { if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 ) { *pClsid = pImageCodecInfo[j].Clsid; free(pImageCodecInfo); return j; // Success } } free(pImageCodecInfo); return -1; // Failure }
GetEncoderClsidはほぼMSDNのコピペです(^^;
Bitmapクラスのコンストラクタを見るとひょっとしたらRGBのメモリを直接食わせることも出来そうですがよくわかりませんでしたorz