マイナーフィックス
前記事
の修正です。24bit pngを8bit 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を介してセーブしないとダメでした。


コメント