Что такое код stretchbit


Что такое код stretchbit

Возвращаемое значение
Отлично от нуля, если точечный рисунок выведен, иначе 0.

Параметры
x
Определяет x-координату (в логических модулях) левого верхнего угла прямоугольника адресата.
y
Определяет y-координату (в логических модулях) левого верхнего угла прямоугольника адресата.
nWidth
Определяет ширину (в логических модулях) прямоугольника адресата.
nHeight
Определяет высоту (в логических модулях) прямоугольника адресата.
pSrcDC
Определяет исходный контекст устройства.
xSrc
Определяет x-координату (в логических модулях) левого верхнего угла исходного прямоугольника.
ySrc
Определяет x-координату (в логических модулях) левого верхнего угла исходного прямоугольника.
nSrcWidth
Определяет ширину (в логических модулях) исходного прямоугольника.
nSrcHeight
Определяет высоту (в логических модулях) исходного прямоугольника.
Specifies
Определяет растровую операцию, которую нужно выполнить. Растровые коды операции определяют, как GDI объединяет цвета в операциях вывода, которые включают текущую кисть, возможный исходный точечный рисунок, и точечный рисунок адресата. Этот параметр может быть одно из следующих значений:

  • BLACKNESS — Растровая карта выводиться черным.
  • DSTINVERT — Инвертирует точечный рисунок адресата.
  • MERGECOPY — Объединяет образец и исходный точечный рисунок, использующий Булевый и (AND) оператор.
  • MERGEPAINT — Объединяет инвертированный исходный точечный рисунок с точечным рисунком адресата используя Булевый или (OR) оператор.
  • NOTSRCCOPY — Копирует инвертированный исходный точечный рисунок адресату.
  • NOTSRCERASE — Инвертирует результат объединения адресата и исходных точечных рисунков, используя Булевый и(AND) оператор.
  • PATCOPY — Копирует образец к точечному рисунку адресата.
  • PATINVERT — Объединяет точечный рисунок адресата с образцом, используя Булевый оператора XOR.
  • PATPAINT — Объединяет инвертированный исходный точечный рисунок с образцом, используя Булевый или(OR) оператор. Объединяет результат этой операции с точечным рисунком адресата используя Булевый или (OR) оператор.
  • SRCAND — Объединяет пиксели адресата и исходных точечных рисунков, используя Булевый и (AND) оператор.
  • SRCCOPY — Копирует исходный точечный рисунок к точечному рисунку адресата.
  • SRCERASE — Инвертирует точечный рисунок и объединяет результат с исходным точечным рисунком, используя Булевый и (AND) оператор.
  • SRCINVERT — Объединяет пиксели адресата и исходных точечных рисунков, используя Булевый оператора XOR.
  • SRCPAINT — Объединяет пиксели адресата и исходных точечных рисунков, используя Булевый или (OR) оператор.
  • WHITENESS — Вся растровая карта белая.

Замечания
Копирует точечный рисунок с исходного прямоугольника в прямоугольник адресата, растягивая или сжимая точечный рисунок в случае необходимости, чтобы приспособить размерности прямоугольника адресата. Функция использует режим протяжения контекста устройства адресата (установленный SetStretchBltMode) чтобы определить, как растягивать или сжать точечный рисунок.
Функция StretchBlt перемещает точечный рисунок из исходного устройства, данного pSrcDC на устройство адресата, представляемое объектом контекста устройства, чья функция вызвана. xSrc, ySrc, nSrcWidth, и nSrcHeight параметры определяют левый верхний угол и размерности исходного прямоугольника. x, y, nWidth, и nHeight параметры дают левый верхний угол и размерности прямоугольника адресата. Растровая операция, определенная dwRop определяет, как исходный точечный рисунок и биты уже на устройстве адресата объединены.

Что такое код stretchbit

Не получается вывести картинку в заданные координаты с заданными размерами.
За основу взял пример по DirectDraw из WM6 SDK.

//
// Get size of the bitmap
//
GetObject(hbm, sizeof(bm), &bm);
dx = dx == 0 ? bm.bmWidth : dx; // Use the passed size, unless zero
dy = dy == 0 ? bm.bmHeight : dy;

//
// Get size of surface.
//
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
pdds->GetSurfaceDesc(&ddsd);

Данный код выводит любую картинку на весь экран. Мне же нужно вывести в координаты 20,20 с размерами 20 на 20 пикселей.
Задаю x = y = dx = dy = 20; В результате картинка уезжает за левый верхний край экран и становится еще большей чем была.
В чем может быть проблема?
Все параметры для StretchBlt задаются в logical units. Что это, пиксели или какие то другие юниты?

Правильно комбинируйте StretchBlt и TransparentBlt, чтобы можно было правильно создать прозрачное растровое изображение

ВВЕДЕНИЕ И СООТВЕТСТВУЮЩАЯ ИНФОРМАЦИЯ:

Недавно я задал здесь, в SO, вопрос о правильном масштабировании растрового изображения, чтобы оно могло сохранять качество изображения:

Я попытался использовать предложение, сделанное в комментарии, для использования `StretchBlt, поэтому я создал небольшую демонстрационную программу.

Это улучшило резкость растровых изображений после того, как я установил режим растяжения на BLACKONWHITE ,

Я хотел бы попытаться сделать прозрачной часть растрового изображения с определенным цветом, скажем, черным.

Я использовал TransparentBlt раньше, но я не знаю, как это сделать сейчас.

ПРОБЛЕМА:

Чтобы сохранить резкость картинки, мне нужно StretchBlt это в памяти DC, с режимом растяжения BLACKONWHITE ,

Проблема в том, что я не знаю, как Blt это прозрачно в главном окне DC.

Вот фрагмент кода из демо-приложения:

ВОПРОС:

Как изменить приведенный выше код, чтобы растровое изображение могло быть прозрачным, чтобы была видна тестовая кисть?

Исходное изображение ниже.

Мне просто нужно использовать TransparentBlt( . RGB( 0, 0, 0 ) ); сделать его прозрачным в черных областях.

Пример изображения, на котором показан результат:

МОИ УСИЛИЯ:

Просматривая Интернет, я нашел только простые уроки, касающиеся двойной буферизации.

Я не нашел ничего подобного, но, если честно, я неопытный в WIN32 API, поэтому я не знаю, как правильно сформулировать вопрос, чтобы получить лучшие результаты поиска.

Если потребуется дополнительная информация, попросите ее, и я предоставлю ее.

Что такое код stretchbit

Использую Printer для печати графического изображения.
При использовании Printer.Canvas.Pixels[i,j] все печатается ок (правда в уменьшенном масштабе и жутко медленно), а вот API-функции BitBtl(), SttretchBLT() на Printer.Canvas.Handle печатают пустой лист. Подскажите, в чем может быть проблема. GetDeviceCaps выдает capability RC_BITBLT и RC_STRETCHBLT

А ты как эти функции юзаешь ?
Т.е как потом присваеваешь канвасу принтера ?

.
StretchBlt(Printer.Canvas.Handle, 0,0, 500,500, Image2.Canvas.Handle, 0, 0, 300, 300, SRCCOPY);

А чем не устраивает этот вариант ?
printer.Canvas.StretchDraw(Image1.ClientRect,Image1.Picture.Bitmap);

а он тоже не работает :) поэтому перешел на API

как это не работает ? :-)
Как вы картинку загружаете ?
Код в студию. Чуть шо ICQ№ 926-571

Да, привидите код пожайлуста, а то не видно как вызваются функции StartDoc, EndDoc.

ок. тестовый пример, который не работает:

.
for i := 0 to 300 do
for j := 0 to 300 do
if (i mod 2) = 0 then
Image2.Canvas.Pixels[i,j] := clBlack;
.
StretchBlt(Printer.Canvas.Handle, 0,0, 500,500, Image2.Canvas.Handle, 0, 0, 300, 300, SRCCOPY)

ну или

printer.Canvas.StretchDraw(Image2.ClientRect,Image2.Picture.Bitmap);


> [7] Anatoly © (17.08.05 18:01)
> ок. тестовый пример, который не работает:

Это не тестовый пример. Это мелкий кусок кода.

2Applet
Вызов StretchBlt заключен между вызовами StartDoc EndDoc

2KilkennyCat
он такой и есть, но должен работать

Как распечатать картинку?

Своим кодом делится Олег Кулабухов:

type
PPalEntriesArray = ^TPalEntriesArray;
TPalEntriesArray = array[0..0] of TPaletteEntry;


if IsPaletteDevice then
BitmapInfoSize := sizeof(TBitmapInfo) + (sizeof(TRGBQUAD) * 255)
else
BitmapInfoSize := sizeof(TBitmapInfo);
GetMem(lpBitmapInfo, BitmapInfoSize);


lpBitmapInfo^.bmiHeader.biSize := sizeof(TBitmapInfoHeader);
lpBitmapInfo^.bmiHeader.biW >lpBitmapInfo^.bmiHeader.biHeight := bm.Height;
lpBitmapInfo^.bmiHeader.biPlanes := 1;
if IsPaletteDevice then
lpBitmapInfo^.bmiHeader.biBitCount := 8
else
lpBitmapInfo^.bmiHeader.biBitCount := 24;
lpBitmapInfo^.bmiHeader.biCompression := BI_RGB;
lpBitmapInfo^.bmiHeader.biSizeImage :=
((lpBitmapInfo^.bmiHeader.biWidth *
longint(lpBitmapInfo^.bmiHeader.biBitCount)) div 8) *
lpBitmapInfo^.bmiHeader.biHeight;
lpBitmapInfo^.bmiHeader.biXPelsPerMeter := 0;
lpBitmapInfo^.bmiHeader.biYPelsPerMeter := 0;
if IsPaletteDevice then begin
lpBitmapInfo^.bmiHeader.biClrUsed := 256;
lpBitmapInfo^.bmiHeader.biClrImportant := 256;
end else begin
lpBitmapInfo^.bmiHeader.biClrUsed := 0;
lpBitmapInfo^.bmiHeader.biClrImportant := 0;
end;


hBits := GlobalAlloc(GMEM_MOVEABLE,
lpBitmapInfo^.bmiHeader.biSizeImage);
pBits := GlobalLock(hBits);

GetDiBits(dc,
hBm,
0,
lpBitmapInfo^.bmiHeader.biHeight,
pBits,
TBitmapInfo(lpBitmapInfo^),
DIB_RGB_COLORS);

if IsPaletteDevice then begin

GetMem(lPPalEntriesArray, sizeof(TPaletteEntry) * 256);
<$IFDEF VER100>
NumPalEntries := GetPaletteEntries(hPal,
0,
256,
lPPalEntriesArray^);
<$ELSE>
NumPalEntries := GetSystemPaletteEntries(dc,
0,
256,
lPPalEntriesArray^);
<$ENDIF>
for i := 0 to (NumPalEntries — 1) do begin
lpBitmapInfo^.bmiColors[i].rgbRed :=
lPPalEntriesArray^[i].peRed;
lpBitmapInfo^.bmiColors[i].rgbGreen :=
lPPalEntriesArray^[i].peGreen;
lpBitmapInfo^.bmiColors[i].rgbBlue :=
lPPalEntriesArray^[i].peBlue;
end;
FreeMem(lPPalEntriesArray, sizeof(TPaletteEntry) * 256);
end;


IsDestPaletteDevice :=
GetDeviceCaps(DestDc, RASTERCAPS) and RC_PALETTE = RC_PALETTE;

if IsDestPaletteDevice then begin