いいえ私はあなたの問題を作り直そうとしました。あなたのImage2
ピクセルフォーマットが見えると思われます。私はあなたがpf8bit
を設定していると仮定し、jpgはpf24bit
ですので、緑色に切り捨てられます...また、コピーの矩形は不安定で、StretchDraw
は非常にスムーズです。ここで比較:
とあなたの更新されたコード(Image1
が右にズーム画像イメージとImage2
を左源であると仮定):
あなたがStretchDraw
が最善ではありません見ることができるように彼らが同じスケーリング技術を使用しない理由を確かめてください。
int h,w;
float scale, base = 400.0f;
TRect crect; // copy rect
TRect srect; // I assume some mouse selected rectangle I set it manualy instead
// init and load
Image2->Canvas->CopyMode = cmSrcCopy;
TJPEGImage *img = new TJPEGImage();
img->LoadFromFile("in.jpg");
Graphics::TBitmap *bmp = new Graphics::TBitmap;
bmp->Assign(img);
// I assume this is how you are rendering/store your left (source) image
Image1->Width = bmp->Width; // set dersired size
Image1->Height = bmp->Height;
Image1->Left = 10;
Image1->Top = 10;
Image1->Canvas->Draw(0,0,bmp);
// I assume this is your mouse selection
srect=TRect(90,34,192,154);
h=120; w=102;
// just render into Image1 for visual check
Image1->Canvas->Pen->Color=clYellow;
Image1->Canvas->Pen->Style=psDashDot;
Image1->Canvas->Brush->Style=bsClear;
Image1->Canvas->Rectangle(srect);
Image1->Canvas->Pen->Style=psSolid;
Image1->Canvas->Brush->Style=bsSolid;
// place and resize Image2 next to Image1
Image2->Top=10;
Image2->Left=Image1->Width+20;
Image2->Width = 170;
Image2->Height = 200;
// scaling
scale = (float)img->Width/base;
crect.Left = srect.Left * scale; // srect = source rect
crect.Top = srect.Top * scale;
crect.Right = crect.Left + (srect.Width() * scale);
crect.Bottom = crect.Top + (srect.Height() * scale);
// this is how you change the pixelformat
Image2->Picture->Bitmap->PixelFormat=pf32bit;
// your copy rect alternative
// Image2->Canvas->CopyRect(TRect(0,0,h,w), bmp->Canvas, crect);
// my stretch draw alternative
Graphics::TBitmap *tmp=new Graphics::TBitmap;
tmp->PixelFormat=pf32bit;
tmp->SetSize(srect.Width(),srect.Height());
tmp->Canvas->CopyRect(TRect(0,0,srect.Width(),srect.Height()), bmp->Canvas, srect);
Image2->Canvas->StretchDraw(TRect(0,0,srect.Width(),srect.Height()),tmp);
delete tmp;
// exit
delete img;
delete bmp;
ビットマップのピクセル形式についての詳細を知りたいと高速ダイレクトピクセルフォーマットが表示された場合:
またAssign
とLoadFrom...
呼び出しはピクセルフォーマットを変更することに注意して取ります...
8ビットのプレビュー画像はあなたとは少し異なりますが、私はしました代わりに、私は色の中で最もlikelly diferencesがあるピクセルごとにJPGようにあなたがPNGとしてエンコード掲示スクリーンショットトリミングや再エンコードを使用しても、+/-1px
あなたが気づいたような位置にあることも、あなたの入力イメージを持っていません面積が大きいほど色の歪みが大きくなります。これは、8ビットのピクセルフォーマットでは、パレットで256色しか得られないため、画像にもっと多くの色が含まれていると、より多くの色が切り捨てられてしまいます。選択された領域が大きくなればなるほど、画像にはより多くのピクセル、したがって異なる色が現れます。 GDIはあなたが見るものの結果として、色の量子化が少し劣っています...あなたがより良い何かをしたい場合(ケースには、あなたが出力として8ビット画像を使用して)これらを試してみてください。また、
あなたはCopyRect
可能性が最も高い選択矩形に適合していなかった見ることができるようにスケーリングの切り捨て(より細かい整数計算を行うように見えます)DDAまたは双線形フィルタリング速度を "最適化"する
'CopyRect'がはるかに優れたスケールを変更することで良くない(全体のキャンバスをカバーしていない場合がありますが、ターゲットのサイズとそれのための一時的なビットマップを必要とするかもしれない)の代わりに' StretchDraw'です。問題は、ターゲットピクセル形式でも、8または8ビットの代わりに24または32ビットに設定しようとしている可能性があります。 – Spektre
あなたの提案をお寄せいただきありがとうございます。ソースイメージの一部をデスティネーションにコピーする必要があります。ストレッチドローはソースイメージ全体をコピーし、デスティネーションイメージ上で縮小/ストレッチします。また、TImageやTBitmapのピクセル形式をどのように変更できるかわからないので、ピクセル形式に関連するこれらのオブジェクトのメソッドやプロパティを見つけることができませんでした。 –
私は私の答えあなたの答えのための – Spektre