0

ビットマップ画像を格納する MySQL テーブルがあり、それらを同じテーブルの JPEG 形式に変換したいと考えています。誰でも解決策を見つけるのを手伝ってもらえますか?

テーブルのサイズを小さくするためにこれが必要です...

4

1 に答える 1

5

ADO を使用して MySQL データベースにアクセスすると、次のようになります (テストされていません)。このコードは、操作したい as という名前のテーブルとYourTable、画像を as に変換する BLOB フィールドがあることを前提としていますImageField。オブジェクトのConnectionStringプロパティで、DB への接続文字列を指定する必要があることに注意してください。ADOConnection

uses
  DB, ADODB, JPEG;

procedure ConvertImage(BlobField: TBlobField);
var
  BMPImage: TBitmap;
  JPEGImage: TJPEGImage;
  MemoryStream: TMemoryStream;
begin
  MemoryStream := TMemoryStream.Create;
  try
    BlobField.SaveToStream(MemoryStream);
    BMPImage := TBitmap.Create;
    try
      MemoryStream.Position := 0;
      BMPImage.LoadFromStream(MemoryStream);
      JPEGImage := TJPEGImage.Create;
      try
        JPEGImage.Assign(BMPImage);
        MemoryStream.Position := 0;
        JPEGImage.SaveToStream(MemoryStream);
      finally
        JPEGImage.Free;
      end;
    finally
      BMPImage.Free;
    end;
    MemoryStream.Position := 0;
    BlobField.LoadFromStream(MemoryStream);
  finally
    MemoryStream.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ADOTable: TADOTable;
  ADOConnection: TADOConnection;
begin
  ADOConnection := TADOConnection.Create(nil);
  try
    ADOConnection.LoginPrompt := False;
    // here you have to specify the connection string to your database
    // according to your connection parameters
    ADOConnection.ConnectionString := '<enter your connection string here>';
    ADOConnection.Open;
    if ADOConnection.Connected then
    begin
      ADOTable := TADOTable.Create(nil);
      try
        ADOTable.Connection := ADOConnection;
        ADOTable.TableName := 'YourTable';
        ADOTable.Filter := 'ImageField IS NOT NULL';
        ADOTable.Filtered := True;
        ADOTable.CursorType := ctOpenForwardOnly;
        ADOTable.Open;
        ADOTable.First;
        while not ADOTable.Eof do
        begin
          ADOTable.Edit;
          ConvertImage(TBlobField(ADOTable.FieldByName('ImageField')));
          ADOTable.Post;
          ADOTable.Next;
        end;
      finally
        ADOTable.Free;
      end;
    end;
  finally
    ADOConnection.Free;
  end;
end;
于 2012-11-30T00:46:29.683 に答える