2014-01-02 1 views
-1

Окружающая среда: Delphi XE5, Win7Firemonkey: Почему TBitmap.LoadFromFile() не работает?

У меня есть приложение VCL. Хотите использовать классы Firemonkey для небольшой обработки изображений. Задача - получить эскизы из файлов изображений.

bmp: TBitmap; 
... 
bmp := FMX.Graphics.TBitmap.Create(100, 100); 
bmp.LoadThumbnailFromFile(filename, 100, 100); 

Любая комбинация TBitmap и LoadFromFile, LoadFromStream, CreateFromFile терпит неудачу с исключением.

Я попытался загрузить bmp, png, tif, jpg ... всегда тот же результат.

В отладчике я вижу исключение нарушения прав доступа в FMX.Canvas.D2D.pas в строке:

TCanvasD2D.ImagingFactory.CreateDecoderFromStream(stream, GUID_NULL, WICDecodeMetadataCacheOnDemand, dec); 

Что я должен сделать, чтобы избежать исключений и получить рабочий код? Чтобы включить некоторые кодеки?

ОБНОВЛЕНИЕ: На всех ... Можно ли использовать классы Firemonkey в приложении VCL? Он ищет меня, я не могу. Я прав?

UPDATE2: Теперь я стараюсь идти со следующим подходом Writing a FireMonkey DLL for use with a VCL application.

Моего FireMonkey DLL полного код

library wnimage; 

uses 
    System.SysUtils, 
    System.Classes, 
    FMX.Graphics; 

{$R *.res} 


function GetThumbnail(filename: String; width, height: Integer): TStream; 
var 
    bmp, th: TBitmap; 
begin 
    bmp := TBitmap.CreateFromFile(filename); 
    th := bmp.CreateThumbnail(width, height); 
    Result := TMemoryStream.Create; 
    th.SaveToStream(Result); 
    th.Free; 
    bmp.Free; 
end; 

exports 
    GetThumbnail; 

begin 
end. 

И снова я получаю такое же нарушение прав доступа в библиотеке строки:

bmp := TBitmap.CreateFromFile(filename); 
+0

Почему вы чувствуете необходимость использования FMX? –

+1

Нет необходимости использовать FMX для этого. Реализация «CreateThumbnail» на самом деле не ищет встроенную миниатюру - все, что она делает, это создать новый экземпляр TBitmap с указанным размером и нарисовать исходную растровую карту, что вы можете сделать достаточно легко с помощью VCL. Фактически, для изображений JPEG, VCL фактически предлагает больше возможностей, поскольку класс TJpegImage обладает свойством Scale - установите его перед jsEighth перед загрузкой изображения, и вы избежите штрафа за то, что сначала загрузите полное изображение. –

+0

Проблема в том, что мне нужны миниатюры не только для bmp/​​jpeg, но и для png/tif и так далее. И FMX может это сделать ... – mad

ответ

1

Я не уверен, какие части firemonkey вы можете использовать в VCL, но tbitmap из VCL не будет совместим с tbitmap с firemonkey в любом случае. Не уверен, насколько полезно использовать его в VCL, но чтобы избежать ошибки, вам нужно объявить переменную bmp как fmx tbitmap.

вар ВМР: FMX.Graphics.TBitmap

+0

Я пробовал ... не помогает. Теперь я попытался пойти со следующим подходом: http: //blogs.embarcadero.com/stephenball/2011/10/10/writing-a-firemonkey-dll-for-use-with-a-vcl-application/ – mad

0

Следующая будет работать и тестируется в xe5 с UPDATE2 и исправлениями 1 + 3. Вы должны использовать Tbitmapsurface для того, чтобы получить savetostream использовать формат, который будет распознается при загрузке в VCL Timage. Вы не можете просто скопировать fmx tbitmap в vcl tbitmap.

unit Unit1; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, fmx.graphics, Vcl.ExtCtrls, fmx.surfaces; 

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    OpenDialog1: TOpenDialog; 
    Image1: TImage; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.Button1Click(Sender: TObject); 

var bmp:fmx.graphics.tbitmap; 
    astream:tmemorystream; 
    surface:tbitmapsurface; 

begin 
    if opendialog1.Execute then 
    begin 
    bmp := FMX.Graphics.TBitmap.Create(100, 100); 
    bmp.LoadThumbnailFromFile(opendialog1.filename, 100, 100); 

    astream:=tmemorystream.Create; 
    surface:=tbitmapsurface.Create; 
    surface.Assign(bmp); 
    try 
    tbitmapcodecmanager.SaveToStream(astream,surface,'bmp'); 
    astream.Seek(0,tseekorigin.soBeginning); 
    image1.Picture.bitmap.LoadFromStream(astream); 
    finally 
     astream.free; 
     bmp.free; 
     surface.free 
    end; 
    end; 
end; 

end. 
+0

Да, когда у меня есть FM-форма и преобразование растрового изображения внутри, тогда все в порядке. Но мне нужна четкая функция без формы и так далее. Просто ld bitmap и сохранить в поток без какой-либо формы и так далее. И это не сработает. – mad

+0

Нет формы FM только форма VCL для выбора файла и подтверждения правильности эскиза, загружая поток в изображение VCL. Поэтому он использует VCL для выбора файла Firemonkey для создания миниатюры и записи в поток и VCL для загрузки потока и отображения его. –

 Смежные вопросы

  • Нет связанных вопросов^_^