Delphi TCanvasを使用してJPEG画像を印刷する際に問題があります。 JPEGが黒の の正方形ではなく、30-50%の間で印刷されます。 を表示するために多くの設定を変更しようとしましたが、印刷に失敗する特定の条件がありましたが、何も書いていない時にはまだ動作していませんでした。黒いJPEG、または正しく印刷されるかどうかを確認します。Delphi - JPEGを読み込んで出力を黒い四角で印刷していますか?
ここでは、キャンバスにJPEGを印刷するためのコードを示します。
Screen.Cursor := crHourGlass;
try
// initialize image
//>>imgImage := TImage.Create(Self);
imgImage := TImage.Create(Application);
// load image from file
imgImage.Picture.LoadFromFile(sFileNameAndPath);
// set width and height to that of loaded image
////imgImage.Autosize := true;
////Printer.Orientation := poPortrait;
// Header
Printer.Canvas.Font.Height := MulDiv(GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY), 12, 72);
Printer.Canvas.Font.Name := 'Courier New';
// Determine height and width of 1 printer-character
iDeltaW := Printer.Canvas.TextWidth('X');
iDeltaH := Printer.Canvas.TextHeight('X');
// ------------------------------
// Method #1 - columns and lines
// ------------------------------
// what column to printing from
iFromLeftMargin := iLeft * iDeltaW;
// what line to print from
iFromTopOfPage := iTop * iDeltaH;
// ------------------------------
// Method #2 - pixels
// ------------------------------
iPPW := Printer.PageWidth;
iPPH := Printer.PageHeight;
iIPW := imgImage.Picture.Width;
ePXW := iPPW/iInvImageWidth;
ePXH := iPPH/iInvImageHeight;
//~//iFromLeftMargin := Ceil(iLeft * pxW);
//~//iFromTopOfPage := Ceil(iTop * pxH);
iFromLeftMargin := Ceil(iLeft * ePXW);
iFromTopOfPage := Ceil(iTop * ePXH);
// Set printed bitmap width
iPrintedImageWidth := MulDiv(iPPW, iIPW, iInvImageWidth);
// Set printed bitmap height to maintain aspect ratio
iPrintedImageHeight := imgImage.Picture.Height * iPrintedImageWidth DIV
imgImage.Picture.Width; // maintain aspect ratio of bitmap
Bitmap := TBitmap.Create;
try
Bitmap.Width := imgImage.Picture.Width;
Bitmap.Height := imgImage.Picture.Height;
Bitmap.PixelFormat := pf24bit;
Bitmap.IgnorePalette := False;
// Convert JPEG (GIF, or whatever) to BMP
Bitmap.Canvas.Draw(0, 0, imgImage.Picture.Graphic);
// Print Image
PrintBitmap(Printer.Canvas,
Rect(iFromLeftMargin, iFromTopOfPage,
iFromLeftMargin + iPrintedImageWidth,
iFromTopOfPage + iPrintedImageHeight),
Bitmap);
finally
// free bitmap memory
Bitmap.Free;
end;
// free image memory
imgImage.Free;
finally
Screen.Cursor := crDefault;
end;
誰にでもアイデアがあれば、非常に感謝しています。
よろしく、 ジェームズ
EDIT:以下PrintBitmapメソッドメソッドのコード。私はビットマップをディスクに保存してそれが生成されているときにそれを表示するようアドバイスしました。印刷された出力が黒い四角であっても黒い四角で保存されることはありません。私は、この問題がPrintBitmapコードにあることを示してほしい。
procedure PrintBitmap(Canvas: TCanvas; DestRect: TRect; Bitmap: TBitmap);
var
BitmapHeader: pBitmapInfo;
BitmapImage: POINTER;
HeaderSize: DWORD;
ImageSize: DWORD;
begin
GetDIBSizes(Bitmap.Handle, HeaderSize, ImageSize);
GetMem(BitmapHeader, HeaderSize);
GetMem(BitmapImage, ImageSize);
try
GetDIB(Bitmap.Handle, Bitmap.Palette, BitmapHeader^, BitmapImage^);
StretchDIBits(Canvas.Handle,
DestRect.Left, DestRect.Top, // Destination Origin
DestRect.Right - DestRect.Left, // Destination Width
DestRect.Bottom - DestRect.Top, // Destination Height
0, 0, // Source Origin
Bitmap.Width, Bitmap.Height, // Source Width & Height
BitmapImage,
TBitmapInfo(BitmapHeader^),
DIB_RGB_COLORS,
SRCCOPY);
finally
FreeMem(BitmapHeader);
FreeMem(BitmapImage);
end;
end; {PrintBitmap}
残念ながら、このコードは私の会社で働いていない人が書いたもので、既存の問題を修正しようとしています。
コードを正しくフォーマットするために時間をかけてください。タブ文字は使用しないでください。インデントは4つのスペース文字で始まり、必要に応じてインデントにスペースを追加します。(あなたの質問を入力している場所のすぐ下を見て、あなたの投稿をリアルタイムでプレビューすることができるので、書式がどのようになっているのかが分かりやすくなります)。投稿時に書式を設定するだけでなく、これを行うだけでなく、読みやすいようにして、迅速に回答を得る良い機会を提供します。 :) –
これはマルチスレッドアプリケーションですか?また、常に同じjpgファイルが失敗するのでしょうか? VCLはスレッドセーフではないので、私はこれまで同様の問題を抱えていたので、これを尋ねます。 – Steve
あのケンのおかげで、不注意に申し訳ありません。こんにちはスティーブ - いいえ、そのシングルスレッドとは異なるJPEGファイルではなく、すべてではありません。 – jmc