Dziś napotkałem dziwne zachowanie metody Graphics.DrawImageUnscaledAndClipped. Problem polegał na tym, że na niektórych drukarkach (w tym na drukarce HP OfficeJet J5780) kiedy po raz kolejny na kartce należało umieścić ten sam obrazek, funkcja umieszczała obrazek, ale na nim wymalowywała obrazek jeszcze raz (tym razem skalując go). Efekt wyglądał koszmarnie. Cała seria ładnie wydrukowanych obrazków przykrywała większość kartki, ale niektóre z obrazków były dodatkowo przykryte tym samym, lecz zeskalowanym obrazkiem. Owe felerne wywołanie wyglądało tak:
e.Graphics.DrawImageUnscaledAndClipped(img,new Rectangle(lineX, lineY, itemWidth, itemHeight));
Na innych drukarkach, w tym na emulatorze PDF wydruk wychodził poprawnie. Cóż było robić? Trzeba wymyślić jakieś obejście problemu. Jeden z pomysłów był taki: skoro funkcja obcinająca obrazek sobie nie radzi, to zrobię to sam. Oto funkcja, która przycina obrazek:
public Image ClipImage(Image image,Rectangle rect){
Bitmap bmp = (Bitmap)image;
return (Image)bmp.Clone(rect,image.PixelFormat);
}
Mając taką funkcję najpierw sam przycinam obrazek do odpowiedniego rozmiaru, a następnie umieszczam go na wydruku mniej więcej o tak:
Image img = ClipImage(originalImage, new Rectangle(0, 0, itemWidth, itemHeight)); e.Graphics.DrawImage(img,new Rectangle(lineX, lineY, itemWidth, itemHeight));
I po kłopocie!