プログラム修正

マイナーフィックス

前記事

の修正です。24bit png8bit pngに変換するプログラムを書いていて気がつきました。

Unit1.cppを下記に変えてください。

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <jpeg.hpp>
#include <Vcl.Imaging.pngimage.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TRect absarea;
int width;
int height;
int vheight;

void LoadJpegFile(const AnsiString & Src,
							Graphics::TBitmap * Bitmap)
{
		TJPEGImage * Jpeg = new TJPEGImage();

	Jpeg->Performance = jpBestQuality;
		Jpeg->PixelFormat = jf24Bit;
		Jpeg->Grayscale = false;
		Jpeg->LoadFromFile(Src);

		Bitmap->HandleType = bmDIB;
		Bitmap->PixelFormat = pf32bit;
		Bitmap->Width = Jpeg->Width;
		width = Jpeg->Width;
		Bitmap->Height = Jpeg->Height;
		height = Jpeg->Height;
		Bitmap->Canvas->Draw(0,0,Jpeg);

		vheight = 640* height / width ;

		delete Jpeg;
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
		FDrawing = false;
		FBkBmp = new TBitmap();

		LoadJpegFile("frame0.jpg",FBkBmp);
		//Image1->Canvas->Draw(0,0,FBkBmp);
		TRect dest = {0,0,640,vheight};

		Image1->Height = vheight;
		Image1->Width = 640;

		//Image1->Canvas->Draw(dest,FBkBmp);
		Image1->Canvas->StretchDraw(dest,FBkBmp);
		//Canvas->StretchDraw()


}


//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
	 delete FBkBmp;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
		  int X, int Y)
{
	if (Button == mbLeft) //    N   b N ̂ݑΏ 
	{
		FDrawing = true;
		FStartPos = Point(X, Y);
		FLastPos = Point(X, Y);

        //    ݂  Image1  ̏ ԁi w i j   FBkBmp  ɃR s [   ĕۑ 
        FBkBmp->Assign(Image1->Picture->Bitmap);
    }

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X,
          int Y)
{
     if (FDrawing)
    {
        //     o b N A b v    w i      ߂  i   h   b O g        ߁j
        Image1->Picture->Bitmap->Assign(FBkBmp);

        //  `  ݒ 
        Image1->Canvas->Pen->Color = clRed;
        Image1->Canvas->Pen->Width = 1;
        Image1->Canvas->Brush->Style = bsClear; //    ͓   

        //  J n ʒu   猻 ݂̃J [ \   ʒu ܂Ŏl p `  `  
        Image1->Canvas->Rectangle(FStartPos.x, FStartPos.y, X, Y);

		//   ʍX V

		FEndPos.x = X;
		FEndPos.y = Y;

        Image1->Refresh();
    }

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
    if (Button == mbLeft && FDrawing)
    {
        FDrawing = false; //  h   b O I  

        //  Ō Ɋm 肵   } `  `  
        Image1->Canvas->Pen->Color = clRed;
        Image1->Canvas->Pen->Width = 1;
        Image1->Canvas->Brush->Style = bsClear;
        Image1->Canvas->Rectangle(FStartPos.x, FStartPos.y, X, Y);

        Image1->Refresh();
    }

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
		//Graphics::TBitmap * Bitmap = new Graphics::TBitmap();
		//LoadJpegFile("IMG_0201.JPG",Bitmap);
		//Image1->Canvas->Draw(0,0,Bitmap);
		//delete Bitmap;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------

void __fastcall TForm1::AddRectClick(TObject *Sender)
{
	TRect area = { FStartPos.X+1,FStartPos.Y+1,FEndPos.X-1,FEndPos.Y-1};

	int	width2 = area.Width();
	int	height2 = area.Height();

	Image2->Width = width2;
	Image2->Height = height2;


	TRect dst = {0,0,Image2->Width,Image2->Height};

	Image2->Canvas->CopyRect(dst, Image1->Canvas, area);

	absarea = area;
}
//---------------------------------------------------------------------------

/*
void __fastcall TForm1::SaveClick(TObject *Sender)
{
	Image2->Picture->SaveToFile("output.png");
}
*/

//---------------------------------------------------------------------------

void __fastcall TForm1::AutoClick(TObject *Sender)
{
	//loop through 1 to 9
	String outfilename = "frame0.png";
	TPngImage* img = new TPngImage();
	img->Assign(Image2->Picture->Bitmap);
	img->SaveToFile(outfilename);

	for( int frame = 1 ; frame < 10 ; frame++ ){
		String filename = "frame" + IntToStr(frame) + ".jpg";
		outfilename = "frame"+ IntToStr(frame) + ".png";

		FBkBmp = new TBitmap();

		LoadJpegFile(filename,FBkBmp);

		TRect dest = {0,0,640,vheight};

		Image1->Height = vheight;
		Image1->Width = 640;

		TRect dst = {0,0,Image2->Width,Image2->Height};
		Image1->Canvas->StretchDraw(dest,FBkBmp);
		Image2->Canvas->CopyRect(dst, Image1->Canvas, absarea);
		//Image2->Picture->SaveToFile(outfilename);
		img->Assign(Image2->Picture->Bitmap);
		img->SaveToFile(outfilename);

	}

    delete img;
}
//---------------------------------------------------------------------------

要するに、一旦TPngImage* imgで受けてから、それを”*.png”にセーブしないとpngファイルのヘッダーが正しく保存されず、以降のプログラムで、

という実行時のエラーが出ます。正しくは、

	String outfilename = "frame0.png";
	TPngImage* img = new TPngImage();
	img->Assign(Image2->Picture->Bitmap);
	img->SaveToFile(outfilename);

というようにTPngImageを介してセーブしないとダメでした。

コメント