Home | History | Annotate | Download | only in src
      1 // Copyright 2015 Google Inc.
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //      http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 //
     15 ////////////////////////////////////////////////////////////////////////////////
     16 //
     17 // The purpose of the preview-image-extractor (piex) is to find and extract the
     18 // largest JPEG compressed preview image contained in a RAW file.
     19 //
     20 // Even for unsupported RAW files we want to provide high quality images using a
     21 // dedicated, small and portable library. That is possible by taking the preview
     22 // image contained in all RAW files.
     23 //
     24 // Typically a preview image is stored as JPEG compressed, full size (or at
     25 // least half size) image in a RAW file.
     26 //
     27 // A typical client code snippet:
     28 //
     29 //   // In C++
     30 //   PreviewImageData image_data;
     31 //   unique_ptr<StreamInterface> data_stream(new DataStream(file));
     32 //   Error err = GetPreviewImageData(data_stream.get(), &image_data));
     33 //   if (err == Error::kFail) {
     34 //     // The input data seems to be broken.
     35 //     return;
     36 //   } else if (err == Error::kUnsupported) {
     37 //     // The input data is not supported.
     38 //     return;
     39 //   }
     40 //
     41 //   // Uncompress the JPEG as usual, e.g. on Android with the BitmapFactory:
     42 //   // In Java
     43 //   Bitmap bitmap = BitmapFactory.decodeByteArray(
     44 //       file.at(image_data.preview_offset), image_data.preview_length);
     45 
     46 #ifndef PIEX_PIEX_H_
     47 #define PIEX_PIEX_H_
     48 
     49 #include <string>
     50 #include <vector>
     51 
     52 #include "src/piex_types.h"
     53 
     54 namespace piex {
     55 
     56 // Returns the maximum number of bytes IsRaw() will read from the stream.
     57 size_t BytesRequiredForIsRaw();
     58 
     59 // Returns true if 'data' contains a RAW file format, even if it is not
     60 // supported by Piex, false otherwise. Reads at most BytesRequiredForIsRaw()
     61 // from the stream.
     62 bool IsRaw(StreamInterface* data);
     63 
     64 // Gets the largest JPEG compressed preview image data. On success
     65 // 'preview_image_data' contains image metadata, the unverified length and the
     66 // offset to a JPEG compressed image from the beginning of the file.
     67 //
     68 // Returns 'kFail' when something with the data is wrong.
     69 // Returns 'kUnsupported' if file format is not supported.
     70 //
     71 // One could check the "preview_image_data->preview_length != 0" for the
     72 // existance of a preview image.
     73 Error GetPreviewImageData(StreamInterface* data,
     74                           PreviewImageData* preview_image_data);
     75 
     76 // Returns true if the full width and height and the mosaic pattern dimension of
     77 // a DNG image could be obtained. False otherwise.
     78 bool GetDngInformation(StreamInterface* data, std::uint32_t* width,
     79                        std::uint32_t* height,
     80                        std::vector<std::uint32_t>* cfa_pattern_dim);
     81 
     82 // Returns true if Exif orientation for the image can be obtained. False
     83 // otherwise.
     84 bool GetOrientation(StreamInterface* data, std::uint32_t* orientation);
     85 
     86 // Returns a vector of upper case file extensions, which are used as a first
     87 // step to quickly guess a supported file format.
     88 std::vector<std::string> SupportedExtensions();
     89 
     90 }  // namespace piex
     91 
     92 #endif  // PIEX_PIEX_H_
     93