Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2011, 13:50   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
Вопрос Сохранить изображение из буфера

Как поместить изображение из буфера например сюда:
Код:
var
  b: tbitmap;
begin
  b := tbitmap.create;
...
Shouldercannon вне форума Ответить с цитированием
Старый 09.06.2011, 14:09   #2
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Смотря в каком формате оно попало в буфер
mss вне форума Ответить с цитированием
Старый 09.06.2011, 18:23   #3
volod3000
Форумчанин
 
Аватар для volod3000
 
Регистрация: 18.12.2008
Сообщений: 266
По умолчанию

Вот три способа :

Код:
image1.Picture.Assign(Bitmap);
image1.picture.bitmap.handle:=clipboard.getashandle(cf_bitmap);
image1.Picture.Assign(Clipboard);
Но, есть но, с родным буфером windows, почему-то, не работает.

Прикрепленный файл для чтения :
Вложения
Тип файла: pdf bo.pdf (141.5 Кб, 31 просмотров)

Мало открыть человеку глаза, большинство еще просит указать дорогу и ждет волшебного пенделя.

Последний раз редактировалось volod3000; 09.06.2011 в 18:32.
volod3000 вне форума Ответить с цитированием
Старый 09.06.2011, 19:50   #4
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
По умолчанию

Изображение сделано с помощью PrintScreen и соответсвенно оно в формате *.BMP. В Image ничего втавлять не надо так как размеры изображения неизвестны.

Последний раз редактировалось Shouldercannon; 09.06.2011 в 19:59.
Shouldercannon вне форума Ответить с цитированием
Старый 09.06.2011, 20:17   #5
volod3000
Форумчанин
 
Аватар для volod3000
 
Регистрация: 18.12.2008
Сообщений: 266
По умолчанию

Тогда можно так :

Код:

procedure SaveAsBitmap(Graphic: TGraphic; FileName: String);
var
Bitmap: TBitmap;
begin
Bitmap := TBitmap.Create;
try
Bitmap.PixelFormat := pf24bit;
Bitmap.Width := Graphic.Width;
Bitmap.Height := Graphic.Height;
Bitmap.Canvas.Draw(0, 0, Graphic);
Bitmap.SaveToFile(FileName);
finally
Bitmap.Free;
end;
end;
.............................................
...........................

     image1.Picture.Assign(Clipboard);
     Bitmap := TBitmap.Create;
     SaveAsBitmap(Image1.Picture.Graphic, 'Whatever.bmp');
     Bitmap.LoadFromFile('Whatever.bmp');
     Image2.Picture.Assign(Bitmap);
Результат :

Мало открыть человеку глаза, большинство еще просит указать дорогу и ждет волшебного пенделя.
volod3000 вне форума Ответить с цитированием
Старый 09.06.2011, 20:30   #6
volod3000
Форумчанин
 
Аватар для volod3000
 
Регистрация: 18.12.2008
Сообщений: 266
По умолчанию

Если интересно , вот функция скриншота экрана :

Код:
function ScreenShot(Width, Height: Integer; Filename: string): Boolean;
var
  Bih: TBitmapInfoHeader;
  Bfh: TBitmapFileHeader;
  CDC, DC: HDC;
  CBmp: HBitMap;
  Bmp: Pointer;
  BmpInfo: TBitMapInfo;
  F, Size, Written: LongWord;
begin
 try
  Width  := GetSystemMetrics(SM_CXSCREEN);
  Height := GetSystemMetrics(SM_CYSCREEN);
  DC := GetDC(0);
  CDC := CreateCompatibleDC(DC);
  Bih.biSize := SizeOf(TBitmapInfoHeader);
  Bih.biWidth := Width;
  Bih.biHeight := Height;
  Bih.biPlanes := 1;
  Bih.biBitCount := GetDeviceCaps(DC, BITSPIXEL) * GetDeviceCaps(DC, PLANES);
  if Bih.biBitCount = 32 then Bih.biBitCount := 24;
  Size := 3 * Width * Height;
  Bfh.bfType := $4D42;
  Bfh.bfOffBits := SizeOf(TBitmapFileHeader) + SizeOf(TBitmapInfoHeader);
  BmpInfo.bmiHeader := Bih;
  CBmp := CreateDIBSection(DC, BmpInfo, 0, Bmp, 0, 0);
  SelectObject(CDC, CBmp);
  StretchBlt(CDC, 0, 0, Width, Height, DC, 0, 0, GetSystemMetrics(SM_CXSCREEN),
    GetSystemMetrics(SM_CYSCREEN), SRCCOPY);
  F := CreateFile(PChar(Filename), GENERIC_WRITE, 0, nil, CREATE_ALWAYS, 0, 0);
  WriteFile(F, Bfh, SizeOf(TBitmapFileHeader), Written, nil);
  WriteFile(F, Bih, SizeOf(TBitmapInfoHeader), Written, nil);
  WriteFile(F, Bmp^, Size, Written, nil);
  CloseHandle(F);
  Result := true;
 except
  Result := false;
 end;
end;
ScreenShot(ширина, высота: Integer; куда/имя файла: string)

Мало открыть человеку глаза, большинство еще просит указать дорогу и ждет волшебного пенделя.
volod3000 вне форума Ответить с цитированием
Старый 09.06.2011, 20:32   #7
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
По умолчанию

Код:
  keybd_event(VK_SNAPSHOT, 0, 0, 0);
  keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0);
  if Clipboard.HasFormat(CF_BITMAP) then Image1.Picture.Assign(Clipboard);
  Image1.Picture.SaveToFile(ExtractFilePath(Application.ExeName) + 'temp.bmp');
Имитирую нажатие кнопки PrintScreen. Далее помещаю изображение из буфера в Image и потом из Image сохраняю в файл. С имитацией нажатия PrintScreen новое изображение сохраняется только со второго раза. В чем проблема?
Shouldercannon вне форума Ответить с цитированием
Старый 09.06.2011, 20:57   #8
volod3000
Форумчанин
 
Аватар для volod3000
 
Регистрация: 18.12.2008
Сообщений: 266
По умолчанию

Попробуйте так :

Код:
keybd_event(VK_SNAPSHOT, 0, 0, 0);
  keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0);
  if Clipboard.HasFormat(CF_BITMAP) then Image1.Picture.Assign(Clipboard);
  sleep(100);
  Image1.Picture.SaveToFile(ExtractFilePath(Application.ExeName) + 'temp.bmp');
Дайте время процессору закончить операции.

Мало открыть человеку глаза, большинство еще просит указать дорогу и ждет волшебного пенделя.
volod3000 вне форума Ответить с цитированием
Старый 09.06.2011, 21:02   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Дайте время процессору закончить операции.
и что за бред пишите?(я именно про совокупность местанахождения слипа и того что я процитировал)
код последовательно выполняется, а не многопоточно.

а вот слип, после имитации нажатия клавиш стоит поставить.
(и между нажатием отпусканием кстати тож желательно)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.06.2011, 21:15   #10
volod3000
Форумчанин
 
Аватар для volod3000
 
Регистрация: 18.12.2008
Сообщений: 266
По умолчанию

Поспешил, сори.

Мало открыть человеку глаза, большинство еще просит указать дорогу и ждет волшебного пенделя.
volod3000 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранить картинку из буфера обмена. Silly Student C++ Builder 3 17.05.2011 12:52
Как сохранить HTML в изображение? GroZa Общие вопросы Delphi 1 30.01.2011 15:46
EmbeddedWB - сохранить изображение не перезагружая zver777 Работа с сетью в Delphi 11 26.06.2010 08:05
Сохранить изображение в таблицу Steil Общие вопросы Delphi 1 25.05.2010 10:36
Сохранить/считать изображение в/из файл(а). amdbodia Общие вопросы C/C++ 4 26.05.2009 20:05